wrong get_extents results



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.

Thanks

Oscar Lazzarino

#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_fill(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_fill(pCairoContext);
	} while (pango_layout_iter_next_line(lLayoutIter));
}

int main()
{
	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, 100 * PANGO_SCALE);

	// White bg
	cairo_set_source_rgba(lCairoContext, 1.0, 1.0, 1.0, 1.0);
	cairo_paint(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;
}

Attachment: test.png
Description: PNG image



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