Каир + Панго макет без выравнивания по левому краю
Что здесь происходит?
pango_font_description_set_family(font.get(),"Serif");
pango_font_description_set_absolute_size(font.get(), 16 * PANGO_SCALE);
int w;
int h;
pango_layout_set_font_description (layout.get(),font.get());
pango_layout_set_width(layout.get(),960*PANGO_SCALE/4);
pango_layout_set_text(layout.get(),"Lorem ipsum dolor sit amet, consctetur adipiscing elit. Nulla vel enim est. Phasellus quis lacinia urna.", -1);
//I want right alignment for this layout
pango_layout_set_alignment(layout.get(),PANGO_ALIGN_RIGHT);
pango_layout_get_pixel_size(layout.get(),&w,&h);
cairo_set_source_rgb (cr.get(), 0.0, 0.0, 0.0);
//Move draw point to the right edge, taking the size of the layout into account
cairo_move_to (cr.get(), 960 - 16 - w,16);
pango_cairo_show_layout(cr.get(), layout.get());
//Draw test rectangle around the text.
cairo_rectangle(cr.get(),960-16-w,16,w,h);
cairo_stroke(cr.get());
cairo_surface_write_to_png(surf.get(),"test.png");
Как видно на картинке, текст располагается справа от желаемой позиции. Как я могу найти текст правильно? cairo_move_to
это явно не правильный выбор, или есть какие-либо известные ошибки, влияющие на поведение PANGO_ALIGN_CENTER
, а также PANGO_ALIGN_RIGHT
, PANGO_ALIGN_LEFT
работает как положено.
1 ответ
Решение
Проблема в том, что pango может не отображать текст с правильным смещением. Чтобы исправить проблему, используйте pango_layout_get_pixel_extents
и запросить "чернильный" прямоугольник. Обратите внимание, что он может иметь ненулевой компонент x и y. Вычитание этих смещений из желаемого местоположения приводит к правильному результату.