Commit 01fa8a8
Fix critical spacing bug
Changed files (4)
modifiedlibbirdfont/OpenFontFormat/GlyfTable.valamodifiedlibbirdfont/OpenFontFormat/GposTable.valamodifiedlibbirdfont/OpenFontFormat/HmtxTable.valamodifiedlibbirdfont/OpenFontFormat/KernList.vala
Diff
@@ -43,6 +43,7 @@ public class GlyfTable : OtfTable { // sorted array of glyphs public Gee.ArrayList<GlyphCollection> glyphs;+ public Gee.ArrayList<GlyfData> glyf_data; public uint number_of_unassigned_glyphs = 0; uint16 max_points = 0;@@ -53,6 +54,7 @@ public class GlyfTable : OtfTable { loca_table = l; location_offsets = new Gee.ArrayList<uint32> (); glyphs = new Gee.ArrayList<GlyphCollection> ();+ glyf_data = new Gee.ArrayList<GlyfData> (); } public int get_gid (string name) {@@ -210,6 +212,8 @@ public class GlyfTable : OtfTable { g.remove_empty_paths (); glyf_data = g.get_ttf_data (); + this.glyf_data.add (glyf_data);+ if (g.path_list.size == 0 || glyf_data.paths.size == 0 || glyf_data.get_ncontours () == 0) { // location_offsets will be equal to location_offset + 1 for // all empty glyphs@@ -34,7 +34,6 @@ public class GposTable : OtfTable { this.glyf_table = glyf_table; this.pairs = new KernList (glyf_table); - printd ("Process GPOS\n"); fd.add_ulong (0x00010000); // table version@@ -102,13 +102,14 @@ public class HmtxTable : OtfTable { int16 rsb; int16 lsb; - int16 left_marker; - int16 right_marker;+ int16 left_guide; + int16 right_guide; double xmin; double ymin; double xmax; double ymax;+ int i; Glyph g; @@ -120,20 +121,24 @@ public class HmtxTable : OtfTable { // advance and lsb nmetrics = 0;+ i = 0; foreach (GlyphCollection gc in glyf_table.glyphs) { g = gc.get_current ();- g.boundaries (out xmin, out ymin, out xmax, out ymax);+ + return_if_fail (0 <= i < glyf_table.glyf_data.size);+ + GlyfData gd = glyf_table.glyf_data.get (i); - xmax = Math.rint (xmax * HeadTable.UNITS);- xmin = Math.rint (xmin * HeadTable.UNITS);+ xmax = gd.bounding_box_xmax;+ xmin = gd.bounding_box_xmin; - left_marker = (int16) Math.rint (g.left_limit * HeadTable.UNITS);- right_marker = (int16) Math.rint (g.right_limit * HeadTable.UNITS);+ left_guide = (int16) Math.rint (g.left_limit * HeadTable.UNITS);+ right_guide = (int16) Math.rint (g.right_limit * HeadTable.UNITS); - lsb = (int16) xmin - left_marker;- advance = right_marker - left_marker;+ lsb = (int16) xmin;+ advance = right_guide - left_guide; - extent = (int16) (lsb + xmax - xmin);+ extent = (int16) xmax; rsb = (int16) Math.rint (advance - extent); fd.add_u16 (advance);@@ -163,6 +168,7 @@ public class HmtxTable : OtfTable { advance_width[nmetrics] = (uint16) extent; nmetrics++;+ i++; } // monospaced lsb ...@@ -62,7 +62,7 @@ public class KernList : GLib.Object { num_pairs += kerning_pair.kerning.size; foreach (Kerning k in kerning_pair.kerning) { gid_right = (uint16) glyf_table.get_gid (k.get_glyph ().get_name ());- current_pairs.pairs.add (new Kern (gid_left, gid_right, (int16) (k.val * HeadTable.UNITS)));+ current_pairs.pairs.add (new Kern (gid_left, gid_right, (int16) Math.rint (k.val * HeadTable.UNITS))); } });