2017-02-14 3 views
0

Was ist hier los?Kairo + Pango Layout Non-Link-Ausrichtung

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"); 

Wie auf dem Bild zu sehen, wird der Text rechts von der gewünschten Position positioniert. Wie kann ich den Text richtig finden? cairo_move_to ist hier eindeutig nicht die richtige Wahl, oder gibt es bekannte Fehler, die das Verhalten von PANGO_ALIGN_CENTER und PANGO_ALIGN_RIGHT beeinflussen. PANGO_ALIGN_LEFT funktioniert wie erwartet.

sample render

Antwort

0

Das Problem ist, dass pango nicht den Text-Offset auf seiner korrekten machen kann. Um das Problem zu beheben, verwenden Sie pango_layout_get_pixel_extents und fragen Sie das Rechteck "Tinte" ab. Beachten Sie, dass es möglicherweise eine von Null verschiedene x- und y-Komponente hat. Das Subtrahieren dieser Offsets von der gewünschten Position führt zu dem korrekten Ergebnis.