Re: wrong get_extents results



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;
}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]