Skip to content

Commit

Permalink
X11+pango: correct y position of text in line that was bad for some n…
Browse files Browse the repository at this point in the history
…on-latin scripts and some pango versions.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12639 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Manolo Gouy authored and Manolo Gouy committed Jan 18, 2018
1 parent 18d9891 commit 12a2fc2
Showing 1 changed file with 28 additions and 14 deletions.
42 changes: 28 additions & 14 deletions src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx
Expand Up @@ -1218,8 +1218,8 @@ void Fl_Xlib_Graphics_Driver::font_unscaled(Fl_Font fnum, Fl_Fontsize size) {
Fl_Font_Descriptor *fd = font_descriptor();
if (!fd->height_) {
PangoFont *pfont = pango_font_map_load_font(pfmap_, pctxt_, pfd_);
PangoRectangle ink_rect, logical_rect;
pango_font_get_glyph_extents(pfont, /*PangoGlyph glyph*/'p', &ink_rect, &logical_rect);
PangoRectangle logical_rect;
pango_font_get_glyph_extents(pfont, /*PangoGlyph glyph*/'p', NULL, &logical_rect);
fd->descent_ = PANGO_DESCENT(logical_rect)/PANGO_SCALE;
fd->height_ = logical_rect.height/PANGO_SCALE;
}
Expand Down Expand Up @@ -1248,6 +1248,22 @@ void Fl_Xlib_Graphics_Driver::rtl_draw_unscaled(const char* str, int n, int x, i
do_draw(1, str, n, x+offset_x_*scale_, y+offset_y_*scale_);
}

/* Compute dx, dy, w, h so that fl_rect(x+dx, y+dy, w, h) is the bounding box
of text drawn by fl_draw(str, n, x, y).
Also, compute y_correction to be used to correct the text's y coordinate to make sure
drawn text does not extend below the bottom of the line of text.
*/
static void fl_pango_layout_get_pixel_extents(PangoLayout *layout, int &dx, int &dy, int &w, int &h, int desc, int lheight, int &y_correction) {
PangoRectangle ink_rect;
pango_layout_get_pixel_extents(layout, &ink_rect, NULL);
dx = ink_rect.x;
dy = ink_rect.y - lheight + desc;
w = ink_rect.width;
h = ink_rect.height;
int y = ink_rect.y + ink_rect.height;
y_correction = (y > lheight ? y - lheight : 0);
}

void Fl_Xlib_Graphics_Driver::do_draw(int from_right, const char *str, int n, int x, int y) {
if (!fl_display || n == 0) return;
Region region = clip_region();
Expand Down Expand Up @@ -1286,18 +1302,19 @@ void Fl_Xlib_Graphics_Driver::do_draw(int from_right, const char *str, int n, in
color.color.green = ((int)g)*0x101;
color.color.blue = ((int)b)*0x101;
color.color.alpha = 0xffff;
if (from_right) {
int width, height;
pango_layout_get_pixel_size(playout_, &width, &height);
x -= width;
}
if (!draw_)
draw_ = XftDrawCreate(fl_display, draw_window = fl_window, fl_visual->visual, fl_colormap);
else
XftDrawChange(draw_, draw_window = fl_window);
XftDrawSetClip(draw_, region);

int dx, dy, w, h, y_correction, desc = descent_unscaled(), lheight = height_unscaled();
fl_pango_layout_get_pixel_extents(playout_, dx, dy, w, h, desc, lheight, y_correction);
if (from_right) {
x -= w;
}
pango_xft_render_layout(draw_, &color, playout_, (x + line_delta_)*PANGO_SCALE,
(y+line_delta_-height_unscaled()+descent_unscaled())*PANGO_SCALE ); // 1.8
(y - y_correction + line_delta_ - lheight + desc)*PANGO_SCALE ); // 1.8
}

double Fl_Xlib_Graphics_Driver::width_unscaled(const char* str, int n) {
Expand All @@ -1315,12 +1332,9 @@ void Fl_Xlib_Graphics_Driver::text_extents_unscaled(const char *str, int n, int
if (!playout_) context();
pango_layout_set_font_description(playout_, pfd_);
pango_layout_set_text(playout_, str, n);
PangoRectangle ink_rect, logical_rect;
pango_layout_get_pixel_extents(playout_, &ink_rect, &logical_rect);
dx = ink_rect.x + line_delta_;
dy = ink_rect.y + line_delta_ - height_unscaled() + descent_unscaled();
w = ink_rect.width;
h = ink_rect.height;
int y_correction;
fl_pango_layout_get_pixel_extents(playout_, dx, dy, w, h, descent_unscaled(), height_unscaled(), y_correction);
dy -= y_correction;
correct_extents(scale_, dx, dy, w, h);
}

Expand Down

0 comments on commit 12a2fc2

Please sign in to comment.