The Birdfont Source Code


All Repositories / birdfont.git / commitdiff – RSS feed

Draw glyphs with negative lsb

These changes was commited to the Birdfont repository Sun, 13 Dec 2015 21:22:09 +0000.

Contributing

Send patches or pull requests to johan.mattsson.m@gmail.com.
Clone this repository: git clone https://github.com/johanmattssonm/birdfont.git
[Sun, 13 Dec 2015 21:22:09 +0000]

Updated Files

libbirdfont/Renderer/Text.vala
--- a/libbirdfont/Renderer/Text.vala +++ b/libbirdfont/Renderer/Text.vala @@ -48,6 +48,8 @@ public double b = 0; public double a = 1; double truncated_width = -1; + + double margin_left = 0; public Text (string text = "", double size = 17, double margin_bottom = 0) { this.margin_bottom = margin_bottom; @@ -158,6 +160,20 @@ kc = new KerningClasses (empty); } + if (word_with_ligatures.glyph.size > 0) { + double none = 0; + g = word_with_ligatures.glyph.get (0); + if (g != null) { + margin_left = ((!) g).get_left_side_bearing (); + + if (margin_left < 0) { + margin_left = -margin_left; + } else { + margin_left = 0; + } + } + } + for (int i = 0; i < word_with_ligatures.glyph.size; i++) { g = word_with_ligatures.glyph.get (i); @@ -339,32 +355,32 @@ double s = get_font_scale (); double cache_y = py - s * (cached_font.top_limit - cached_font.base_line); - cr.set_source_surface ((!) cache, (int) rint (px), (int) rint (cache_y)); + cr.set_source_surface ((!) cache, (int) rint (px - s * margin_left), (int) rint (cache_y)); cr.paint (); } Surface draw_on_cache_surface (string cacheid) { - double x, y; + double y; double ratio; double cc_y; Context cr; Surface cache_surface; double screen_scale = Screen.get_scale(); double h = font_size * screen_scale + 1; - double w = get_sidebearing_extent () * screen_scale + 1; - - cache_surface = Screen.create_background_surface ((int) w, (int) h); - cr = new Context (cache_surface); - cr.scale(screen_scale, screen_scale); ratio = get_font_scale (); cc_y = (cached_font.top_limit - cached_font.base_line) * ratio; - double px = 0; + double x = margin_left * ratio; double py = cc_y; + + double w = get_sidebearing_extent () * screen_scale + x + margin_left + 1; + cache_surface = Screen.create_background_surface ((int) w, (int) h); + cr = new Context (cache_surface); + cr.scale (screen_scale, screen_scale); + y = cc_y; - x = 0; if (unlikely (cached_font.base_line != 0)) { warning ("Base line not zero."); @@ -377,7 +393,7 @@ end = x + glyph.get_width () * ratio; // truncation - if (truncated_width > 0 && end - px > truncated_width) { + if (truncated_width > 0 && end > truncated_width) { return; } @@ -418,7 +434,15 @@ Surface cache; Context cc; string cache_id; - double xp = x; + double glyph_margin_left = glyph.get_left_side_bearing (); + + if (glyph_margin_left < 0) { + glyph_margin_left = -glyph_margin_left; + } else { + glyph_margin_left = 0; + } + + double xp = x - glyph_margin_left * ratio; double yp = y - cc_y; int offset_x, offset_y; @@ -428,14 +452,14 @@ cache_id = (cacheid == "") ? get_cache_id (offset_x, offset_y) : cacheid; if (unlikely (!glyph.has_cache (cache_id))) { - int w = (int) (glyph.get_width () * ratio) + 2; + int w = (int) ((glyph_margin_left * ratio + glyph.get_width ()) * ratio) + 2; int h = (int) font_size + 2; cache = Screen.create_background_surface (w, h); cc = new Context (cache); cc.scale(Screen.get_scale (), Screen.get_scale ()); - lsb = glyph.left_limit; + lsb = glyph.left_limit - glyph_margin_left; cc.save (); cc.set_source_rgba (r, g, b, a);