Clone in a terminal:
Commit 1e5bf01
Johan Mattsson - 2016-12-13T22:24:26+00:00
1e5bf013f0633d24c3f4e6c07e4fdcc9a3f86b06johan.mattsson.m@gmail.com

Merge branch '2.x' of github.com:johanmattssonm/birdfont into 2.x

Changed files (11)

Diff

diff --git a/libbirdfont/ExportTool.vala b/libbirdfont/ExportTool.valaindex d815e5b..c11f602 100644--- a/libbirdfont/ExportTool.vala+++ b/libbirdfont/ExportTool.vala@@ -17,6 +17,8 @@ using B; namespace BirdFont {  public class ExportTool : GLib.Object {++	public static string? error_message = null; 	 	public ExportTool (string n) { 	}@@ -404,8 +406,7 @@ os.put_string ( 	<p class="big"> 		<span class="capstosmallcaps">OTF</span> features,  		<span class="swashes">like swashes </span>-		<span class="alternates">alternates &amp; </span>-		<span class="smallcaps">small caps</span>, can be added +		<span class="alternates">alternates &amp; </span> small caps, can be added  		to the font.</span> 	</p> </div>@@ -565,16 +566,19 @@ os.put_string ( 		OpenFontFormatWriter fo = new OpenFontFormatWriter (f.units_per_em); 		 		File file = (!) File.new_for_path (ttf);-		File file_mac = (!) File.new_for_path (ttf_mac);+		File file_mac = (!) File.new_for_path (ttf_mac);		++		error_message = null;		 		 		try { 			fo.open (file, file_mac); 			fo.write_ttf_font (f); 			fo.close (); 		} catch (Error e) {-			warning (@"Can't write TTF font to $ttf");+			warning (@"Can't create TTF font to $ttf"); 			critical (@"$(e.message)");-		}+			error_message = e.message;			+		}		 	} 	 	static void write_eot (string ttf, string eot) {diff --git a/libbirdfont/KerningDisplay.vala b/libbirdfont/KerningDisplay.valaindex 54dede3..d0a6e6a 100644--- a/libbirdfont/KerningDisplay.vala+++ b/libbirdfont/KerningDisplay.vala@@ -46,7 +46,7 @@ public class KerningDisplay : FontDisplay { 	public bool adjust_side_bearings = false; 	public bool right_side_bearing = true; -	public bool right_to_left = false; 	+	public static bool right_to_left = false; 	 	 	WidgetAllocation allocation = new WidgetAllocation (); 	@@ -200,7 +200,7 @@ public class KerningDisplay : FontDisplay { 					glyph.add_help_lines ();  					if (right_to_left) {-						cr.translate (x - kern - glyph.get_lsb () - glyph.get_width () - Glyph.xc (), glyph.get_baseline () + y  - Glyph.yc ());+						cr.translate (-kern + x - glyph.get_lsb () - glyph.get_width () - Glyph.xc (), glyph.get_baseline () + y  - Glyph.yc ()); 					} else {						 						cr.translate (kern + x - glyph.get_lsb () - Glyph.xc (), glyph.get_baseline () + y  - Glyph.yc ()); 					}diff --git a/libbirdfont/MainWindow.vala b/libbirdfont/MainWindow.valaindex bb2747a..96f1341 100644--- a/libbirdfont/MainWindow.vala+++ b/libbirdfont/MainWindow.vala@@ -112,7 +112,17 @@ public class MainWindow : GLib.Object { 		}
 	}
 
-	public static void  show_message (string text) {
+	public static void show_message (string text) {+		Tab t = MainWindow.get_tab_bar ().get_selected_tab ();
+		string tab_name = t.get_display ().get_name ();+
+		if (tab_name == "Preview") {+			print ("select over");
+			MenuTab.select_overview ();
+		}+		+		print ("show mess");+		 		MessageDialog md = new MessageDialog (text);
 		show_dialog (md);
 	}
diff --git a/libbirdfont/Menu.vala b/libbirdfont/Menu.valaindex dcb270e..a3004be 100644--- a/libbirdfont/Menu.vala+++ b/libbirdfont/Menu.vala@@ -392,7 +392,12 @@ public class Menu : AbstractMenu {  		MenuItem next_kerning_pair = add_menu_item (t_("Select Next Kerning Pair"), "select next kerning pair"); 		next_kerning_pair.action.connect (() => {-			KerningDisplay.next_pair ();+			if (KerningDisplay.right_to_left)  {+				KerningDisplay.previous_pair ();			+			} else {+				KerningDisplay.next_pair ();+			}+			 			show_menu = false; 		}); 		next_kerning_pair.add_display("Kerning");@@ -401,7 +406,12 @@ public class Menu : AbstractMenu {  		MenuItem previous_kerning_pair = add_menu_item (t_("Select Previous Kerning Pair"), "select previous kerning pair"); 		previous_kerning_pair.action.connect (() => {-			KerningDisplay.previous_pair ();+			if (KerningDisplay.right_to_left)  {+				KerningDisplay.next_pair ();			+			} else {+				KerningDisplay.previous_pair ();+			}+			 			show_menu = false; 		}); 		previous_kerning_pair.add_display("Kerning");diff --git a/libbirdfont/MenuTab.vala b/libbirdfont/MenuTab.valaindex 0e7345a..51bf946 100644--- a/libbirdfont/MenuTab.vala+++ b/libbirdfont/MenuTab.vala@@ -210,7 +210,12 @@ public class MenuTab : FontDisplay { 	public static void signal_file_exported () { 		IdleSource idle = new IdleSource (); 		idle.set_callback (() => {-			export_callback.file_exported ();+			export_callback.file_exported ();			+			+			if (ExportTool.error_message != null) {+				MainWindow.show_message (t_("Can't create TTF font.") + "\n" + (!) ExportTool.error_message);+			}
+ 			return false; 		}); 		idle.attach (null);diff --git a/libbirdfont/OpenFontFormat/GlyfData.vala b/libbirdfont/OpenFontFormat/GlyfData.valaindex 9e58b6f..2fa75c6 100644--- a/libbirdfont/OpenFontFormat/GlyfData.vala+++ b/libbirdfont/OpenFontFormat/GlyfData.vala@@ -43,7 +43,7 @@ public class GlyfData : GLib.Object { 	public Gee.ArrayList<int16> coordinate_y = new Gee.ArrayList<int16> (); 	 	uint16 end_point = 0;-	int16 nflags = 0;+	uint16 nflags = 0; 	 	Glyph glyph; 	@@ -58,53 +58,48 @@ public class GlyfData : GLib.Object { 		 	public GlyfData (Glyph g) { 		bool process;-		PathList qp = g.get_quadratic_paths (); +		PathList all_quadratic = g.get_quadratic_paths (); +		PathList qp = new PathList (); 		 		glyph = g; 						-		foreach (Path p in qp.paths) {+		int i = 0;+		foreach (Path p in all_quadratic.paths) { 			if (p.points.size > 0) {-				if (!is_empty (p)) {+				if (likely (!is_empty (p))) { 					// Add points at extrema 					p.add_extrema ();+					qp.add (p);+				} else {+					warning (@"Path number $i is empty in $(glyph.get_name ())"); 				}+				i++; 			} 		} 		-		process = true;-		-		while (process) {-			points.clear ();-			paths.clear ();-			foreach (Path p in qp.paths) {-				if (!is_empty (p)) {-					paths.add (p);-					foreach (EditPoint ep in p.points) {-						points.add (ep);-					}-				}-			}-			-			if (paths.size == 0) {-				break;+		points.clear ();+		paths.clear ();+		foreach (Path p in qp.paths) {+			paths.add (p);++			foreach (EditPoint ep in p.points) {+				points.add (ep); 			}+		} 			+		if (paths.size > 0) { 			process_end_points (); 			process_flags (); 			process_x ();-			-			// error checking is done here-			process = !process_y (); -			+			process_y (); 	 			process_bounding_box ();-		 }+		} 	}  	bool is_empty (Path p) { 		EditPoint? last = null; 		 		if (unlikely (p.points.size < 2)) {-			warning (@"A path in $(glyph.get_name ()) has less than three points, it will not be exported."); 			return true; 		} 		@@ -114,8 +109,7 @@ public class GlyfData : GLib.Object { 			} 			last = ep; 		}-		-		warning (@"A path in $(glyph.get_name ()) ($(glyph.get_hex ())) has no area but $(p.points.size) points at $(p.get_first_point ().x),$(p.get_first_point ().y).");+ 		return true; 	} @@ -127,9 +121,26 @@ public class GlyfData : GLib.Object { 		return (int16) paths.size; 	} -	public int16 get_nflags () {+	public uint16 get_nflags () { 		return nflags; 	}++	/** Count off curve points and on curve points.+	 * @return the number of points or uint16.MAX if more than uint16.MAX points where found. +	 */ +	public int get_num_points () {+		int points = 0;+		+		foreach (Path quadratic in paths) {+			points += 2 * quadratic.points.size;+			+			if (points >= uint16.MAX) {+				return uint16.MAX;			+			}+		}+		+		return points;+	}			 	 	void process_end_points () {	 		uint16 last_end_point = 0;@@ -138,6 +149,7 @@ public class GlyfData : GLib.Object { 		end_points.clear (); 		end_point = 0; 		+		int path_number = 0; 		foreach (Path quadratic in paths) { 			if (unlikely (quadratic.points.size == 0)) { 				warning (@"No points in path (before conversion $(quadratic.points.size))");@@ -145,20 +157,26 @@ public class GlyfData : GLib.Object { 			} 			 			if (unlikely (quadratic.points.size < 2)) {-				warning ("A path contains less than three points, it will not be exported.");+				warning ("A path contains less than three points, it will not be exported. Path number: $path_number"); 				continue; 			} 			 			foreach (EditPoint e in quadratic.points) {+				if (unlikely (nflags == uint16.MAX - 1)) {+					warning (@"Too many end points in $(glyph.get_name ())");+					break;				+				}+				 				end_point++; 				type = e.get_right_handle ().type; 				 				// off curve-				end_point++;-				-				if (end_point >= 0xFFFF) {-					warning ("Too many points");+				if (unlikely (nflags == uint16.MAX - 1)) {+					warning (@"Too many end points in $(glyph.get_name ())");+					break;				 				}+				+				end_point++; 			} 			end_points.add (end_point - 1); 			@@ -189,7 +207,13 @@ public class GlyfData : GLib.Object { 				 				// off curve 				flags.add (CoordinateFlags.NONE);-				nflags++;+				+				if (unlikely (nflags == uint16.MAX)) {+					warning (@"Too many flags in $(glyph.get_name ())");+					return;				+				}	+								+				nflags++;				 			} 		} 	}@@ -230,7 +254,7 @@ public class GlyfData : GLib.Object { 		} 	} 	-	bool process_y () {+	void process_y () { 		double prev = 0; 		double y; 		Font font = OpenFontFormatWriter.get_current_font ();@@ -238,6 +262,8 @@ public class GlyfData : GLib.Object { 		int epi = 0; 		 		coordinate_y.clear ();++		int path_number = 0;		 		 		foreach (Path p in paths) { 			foreach (EditPoint e in p.points) {@@ -245,17 +271,8 @@ public class GlyfData : GLib.Object { 				coordinate_y.add ((int16) y); 				 				if ((int16) y == 0 && (int16) coordinate_x.get (coordinate_y.size - 1) == 0) {-					warning (@"Point on point in TTF. Index $(coordinate_y.size - 1)");-					-					// FIXME: distorted shape-					/*-					if (BirdFont.has_argument ("--test")) {-						print (glyph.get_name () + "\n");-						print (points.get (epi).to_string ());-						PenTool.remove_point_simplify (new PointSelection (points.get (epi), p));-						return false;-					}-					*/+					warning (@"Point on point in TTF. Index $(coordinate_y.size - 1) "+						+ @"Path: $path_number in $(glyph.get_name ())"); 				} 				 				prev = rint (e.y * UNITS - font.base_line * UNITS);@@ -265,25 +282,13 @@ public class GlyfData : GLib.Object { 				// off curve 				y = rint (e.get_right_handle ().y * UNITS - prev - font.base_line * UNITS); 				coordinate_y.add ((int16) y);--				if ((int16) y == 0 && (int16) coordinate_x.get (coordinate_y.size - 1) == 0) {-					warning (@"Point on point in TTF (off curve) Index: $(coordinate_y.size - 1) ");-					if (BirdFont.has_argument ("--test")) {-						print (glyph.get_name () + "\n");-						print (points.get (epi).to_string ());-						-						// FIXME: distorted shape-						PenTool.remove_point_simplify (new PointSelection (points.get (epi), p));-						return false;-					}-				} 							 				prev = rint (e.get_right_handle ().y * UNITS - font.base_line  * UNITS); 				epi++; 			}+			+			path_number++; 		}-		-		return true; 	} 	 	void process_bounding_box () {diff --git a/libbirdfont/OpenFontFormat/GlyfTable.vala b/libbirdfont/OpenFontFormat/GlyfTable.valaindex c6cea25..d93b0b7 100644--- a/libbirdfont/OpenFontFormat/GlyfTable.vala+++ b/libbirdfont/OpenFontFormat/GlyfTable.vala@@ -209,7 +209,7 @@ public class GlyfTable : OtfTable { 		uint16 end_point; 		uint16 npoints; 		int16 ncontours;-		int16 nflags;+		uint16 nflags; 		int glyph_offset; 		uint len;  		uint coordinate_length;@@ -223,6 +223,12 @@ public class GlyfTable : OtfTable { 		 		g.remove_empty_paths (); 		glyf_data = g.get_ttf_data ();+	+		int points = glyf_data.get_num_points ();+		if (unlikely (points >= uint16.MAX)) {+			warning (@"Too many points in glyph $(g.get_name ()) ($points)");+			throw new FileError.FAILED (t_("Too many control points") + " " + t_("in") + @" $(g.get_name ())");+		} 		 		this.glyf_data.add (glyf_data); 		diff --git a/libbirdfont/OpenFontFormat/Os2Table.vala b/libbirdfont/OpenFontFormat/Os2Table.valaindex 4308069..5d4785a 100644--- a/libbirdfont/OpenFontFormat/Os2Table.vala+++ b/libbirdfont/OpenFontFormat/Os2Table.vala@@ -104,7 +104,6 @@ public class Os2Table : OtfTable { 			fd.add_u32 (0); // ulUnicodeRange3 Bits 64-95 			fd.add_u32 (0); // ulUnicodeRange4 Bits 96-127 		} else {-			warning(@"unicodeRange1: $unicodeRange1 unicodeRange2: $unicodeRange2 unicodeRange3 $unicodeRange3 unicodeRange4: $unicodeRange4"); 			fd.add_u32 (unicodeRange1); // ulUnicodeRange1 Bits 0-31 			fd.add_u32 (unicodeRange2); // ulUnicodeRange2 Bits 32-63 			fd.add_u32 (unicodeRange3); // ulUnicodeRange3 Bits 64-95diff --git a/libbirdfont/PreviewTools.vala b/libbirdfont/PreviewTools.valaindex 41f1e54..c92ea2c 100644--- a/libbirdfont/PreviewTools.vala+++ b/libbirdfont/PreviewTools.vala@@ -62,7 +62,10 @@ public class PreviewTools : ToolCollection  { 				Preview.generate_html_document (); 			} 			-			MainWindow.tabs.select_tab_name ("Preview");+			if (ExportTool.error_message == null) {+				MainWindow.tabs.select_tab_name ("Preview");+			}+			 			return false; 		}); 		diff --git a/libbirdfont/SpacingClass.vala b/libbirdfont/SpacingClass.valaindex a805d1d..697c182 100644--- a/libbirdfont/SpacingClass.vala+++ b/libbirdfont/SpacingClass.vala@@ -53,7 +53,7 @@ public class SpacingClass : GLib.Object  { 			string v = text; 			 			if (v.has_prefix ("U+") || v.has_prefix ("u+")) {-				v = ((!) Font.to_unichar (val).to_string ()).dup ();+				v = ((!) Font.to_unichar (v).to_string ()).dup (); 			} 			 			if (update_first) {diff --git a/libbirdfont/SvgFontFormatWriter.vala b/libbirdfont/SvgFontFormatWriter.valaindex d4948d7..b6090be 100644--- a/libbirdfont/SvgFontFormatWriter.vala+++ b/libbirdfont/SvgFontFormatWriter.vala@@ -59,9 +59,19 @@ class SvgFontFormatWriter : Object  {  		put ("<defs>"); -		put (@"<font id=\"$font_name\" horiz-adv-x=\"250\" >");+		string font_id = font_name.replace (" ", "-");+		font_id = B.XmlParser.encode (font_id); +		+		Glyph space = font.get_space ().get_current ();+		double space_width = space.get_width ();+		+		put (@"<font id=\"$font_id\" horiz-adv-x=\"$(to_float (space_width))\" >"); 		put (@"<font-face units-per-em=\"$(to_float (units_per_em))\" ascent=\"$(to_float (ascent))\" descent=\"$(to_float (descent))\" />"); +		put (@"<font-src>");+		put (@"\t<font-face-name=\"XmlParser.encode ($font_name)\">");+		put (@"</font-src>");+ 		// (missing-glyph goes here)  		// regular glyphs 

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112