On 05/31/2010 02:40 PM, Oscar Lazzarino wrote:
Hi I'm having a problem with pango_layout_get_extents. It seems to me that the results are wrong when used on a layout with center or right alignment, while pango_layout_iter_get_line_extents returns the correct rectangle for every line. In attachment I'm sending a small test program, and also the resulting png image (done with cairo). Compiled with gcc -o testPangoLayouts `pkg-config --cflags --libs pangocairo` testPangoLayouts.c Am I missing something? Or is this a bug? I'm using pango 1.20.1 and cairo 1.6.0.
OK, I found the problem.Looks like the results of pango_layout_get_extents and pango_layout_iter_get_line_extents have different meanings
This image should clarify it. I wonder if this behaviour was intended... The updated code is attached, also, if someone is curious... O.
Attachment:
test.png
Description: PNG image
#include <pango-1.0/pango/pango.h>
#include <cairo/cairo.h>
#include <string.h>
void drawRects(cairo_t *pCairoContext, PangoLayout *pLayout)
{
PangoRectangle pLayoutRect;
pango_layout_get_extents(pLayout, NULL, &pLayoutRect);
cairo_set_source_rgba(pCairoContext, 0.0, 1.0, 0.0, 1.0);
cairo_rectangle(pCairoContext,
pLayoutRect.x / PANGO_SCALE,
pLayoutRect.y / PANGO_SCALE,
pLayoutRect.width / PANGO_SCALE,
pLayoutRect.height / PANGO_SCALE);
cairo_stroke(pCairoContext);
cairo_set_source_rgba(pCairoContext, 1.0, 1.0, 0.0, 0.5);
PangoLayoutIter *lLayoutIter = pango_layout_get_iter(pLayout);
do
{
PangoRectangle lLineRect;
pango_layout_iter_get_line_extents(lLayoutIter, NULL, &lLineRect);
cairo_rectangle(pCairoContext,
lLineRect.x / PANGO_SCALE,
lLineRect.y / PANGO_SCALE,
lLineRect.width / PANGO_SCALE,
lLineRect.height / PANGO_SCALE);
cairo_stroke(pCairoContext);
} while (pango_layout_iter_next_line(lLayoutIter));
}
int main()
{
int lLayoutWidth = 120;
cairo_surface_t *lCairoSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 800, 200);
cairo_t *lCairoContext = cairo_create(lCairoSurface);
PangoFontDescription *lFontDescr = pango_font_description_new();
pango_font_description_set_family(lFontDescr, "Sans");
pango_font_description_set_size(lFontDescr, 10 * PANGO_SCALE);
PangoLayout *lLayout = pango_cairo_create_layout(lCairoContext);
pango_layout_set_font_description(lLayout, lFontDescr);
pango_layout_set_text(lLayout,
"The quick brown fox jumps over the lazy dog",
strlen("The quick brown fox jumps over the lazy dog"));
pango_layout_set_width(lLayout, lLayoutWidth * PANGO_SCALE);
// White bg
cairo_set_source_rgba(lCairoContext, 1.0, 1.0, 1.0, 1.0);
cairo_paint(lCairoContext);
// Some reference lines
cairo_set_source_rgba(lCairoContext, 1.0, 0.0, 0.0, 1.0);
int i;
for (i=0; i<3; i++)
{
int x1 = 100 + 200*i;
int x2 = x1 + lLayoutWidth;
cairo_move_to(lCairoContext, x1, 0);
cairo_line_to(lCairoContext, x1, 200);
cairo_move_to(lCairoContext, x2, 0);
cairo_line_to(lCairoContext, x2, 200);
}
cairo_move_to(lCairoContext, 0, 100);
cairo_line_to(lCairoContext, 800, 100);
cairo_stroke(lCairoContext);
cairo_save(lCairoContext);
{
pango_layout_set_alignment(lLayout, PANGO_ALIGN_LEFT);
cairo_translate(lCairoContext, 100, 100);
drawRects(lCairoContext, lLayout);
cairo_set_source_rgba(lCairoContext, 0.0, 0.0, 0.0, 1.0);
pango_cairo_show_layout(lCairoContext, lLayout);
}
cairo_restore(lCairoContext);
cairo_save(lCairoContext);
{
pango_layout_set_alignment(lLayout, PANGO_ALIGN_CENTER);
cairo_translate(lCairoContext, 300, 100);
drawRects(lCairoContext, lLayout);
cairo_set_source_rgba(lCairoContext, 0.0, 0.0, 0.0, 1.0);
pango_cairo_show_layout(lCairoContext, lLayout);
}
cairo_restore(lCairoContext);
cairo_save(lCairoContext);
{
pango_layout_set_alignment(lLayout, PANGO_ALIGN_RIGHT);
cairo_translate(lCairoContext, 500, 100);
drawRects(lCairoContext, lLayout);
cairo_set_source_rgba(lCairoContext, 0.0, 0.0, 0.0, 1.0);
pango_cairo_show_layout(lCairoContext, lLayout);
}
cairo_restore(lCairoContext);
cairo_surface_write_to_png(lCairoSurface, "test.png");
return 0;
}