diff options
| author | Manolo Gouy <Manolo> | 2018-01-18 13:45:45 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2018-01-18 13:45:45 +0000 |
| commit | 12a2fc2a4d5cd40b2fbdeb7f6e5d949c793106bc (patch) | |
| tree | d51ff50c607b8dc9ce682accf8542ffd99c5515d /src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx | |
| parent | 18d989197001e64a5aa5e8dced5b169b6ea2b776 (diff) | |
X11+pango: correct y position of text in line that was bad for some non-latin scripts and some pango versions.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12639 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx')
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx index f130acbd3..17b2b65b0 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_font_xft.cxx @@ -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; } @@ -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(); @@ -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) { @@ -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); } |
