Clone in a terminal:
Commit bd7708b
Johan Mattsson - 2016-06-26T14:13:33+00:00
bd7708bae6e853ea8b8a3f311499bdeeca8c2d5cjohan.mattsson.m@gmail.com

Convert embedded svg to xml

Changed files (7)

Diff

diff --git a/libbirdfont/EmbeddedSvg.vala b/libbirdfont/EmbeddedSvg.valaindex 82b2f65..af84c7d 100644--- a/libbirdfont/EmbeddedSvg.vala+++ b/libbirdfont/EmbeddedSvg.vala@@ -80,6 +80,44 @@ public class EmbeddedSvg : SvgBird.Object { 	public override string to_string () { 		return "Embedded SVG"; 	}++	public string get_transformed_svg_data () {+		StringBuilder svg = new StringBuilder ();+		+		svg.append ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");+		svg.append ("""<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">""");+		svg.append ("\n");+		+		svg.append (@"<g transform=\"$(transforms.get_xml ())\">\n");+		svg.append (remove_xml_header (svg_data));+		svg.append ("</g>\n");+		+		svg.append ("</svg>\n");+		+		print (svg.str);+		+		return svg.str;+	}++	public string remove_xml_header (string xml_data) {+		string xml = xml_data;+		+		int start = xml.index_of ("<?");+		while (start > -1) {+			int end = xml.index_of ("?>");+			+			if (end == -1) {+				return xml;+			}+			+			end += "?>".length;+			+			xml = xml.substring (start, end);+			start = xml.index_of ("<?");+		}+		+		return xml;+	} }  }diff --git a/libbirdfont/MoveTool.vala b/libbirdfont/MoveTool.valaindex 5af27c7..f75bc6d 100644--- a/libbirdfont/MoveTool.vala+++ b/libbirdfont/MoveTool.vala@@ -546,12 +546,13 @@ public class MoveTool : Tool { 			if (object is EmbeddedSvg) { 				EmbeddedSvg svg = (EmbeddedSvg) object; 				glyph.clear_active_paths ();-				PathList path_list = SvgParser.import_svg_data_in_glyph (svg.svg_data, glyph);+				string transformed_svg_data = svg.get_transformed_svg_data ();+				PathList path_list = SvgParser.import_svg_data_in_glyph (transformed_svg_data, glyph); 				glyph.delete_object (svg);-				+ 				foreach (Path path in path_list.paths) { 					path.move (svg.x - glyph.left_limit, svg.y - font.top_position);-				}+				}				 			} 		} 	}diff --git a/libbirdfont/OpenFontFormat/SvgTable.vala b/libbirdfont/OpenFontFormat/SvgTable.valaindex 2b026a2..84f5837 100644--- a/libbirdfont/OpenFontFormat/SvgTable.vala+++ b/libbirdfont/OpenFontFormat/SvgTable.vala@@ -263,6 +263,7 @@ public class SvgTable : OtfTable { 		 		svg.append ("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"); 		svg.append ("""<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">""");+		svg.append ("\n"); 		 		Glyph g = glyphs.get_current (); 		Font font = OpenFontFormatWriter.get_current_font ();diff --git a/libbirdfont/SvgParser.vala b/libbirdfont/SvgParser.valaindex 8892942..067c252 100644--- a/libbirdfont/SvgParser.vala+++ b/libbirdfont/SvgParser.vala@@ -217,6 +217,10 @@ public class SvgParser { 				parse_layer (t, pl); 			} +			if (t.get_name () == "svg") {+				parse_layer (t, pl);+			}+			 			if (t.get_name () == "switch") { 				parse_layer (t, pl); 			}@@ -283,7 +287,13 @@ public class SvgParser { 				parse_layer (t, layer); 				pl.objects.add (layer); 			}-			++			if (t.get_name () == "svg") {+				layer = new Layer ();+				parse_layer (t, layer);+				pl.objects.add (layer);+			}+				 			if (t.get_name () == "polygon") { 				parse_polygon (t, pl); 			}diff --git a/libsvgbird/Doubles.vala b/libsvgbird/Doubles.valaindex e45c2dc..431e1cf 100644--- a/libsvgbird/Doubles.vala+++ b/libsvgbird/Doubles.vala@@ -85,6 +85,23 @@ public class Doubles : GLib.Object { 		 		return data[index].value; 	}++	public string get_string (int i) {+		return round (get_double (i));+	}++	public static string round (double p) {+		string v = p.to_string ();+		char[] c = new char [501];+		+		v = p.format (c, "%3.15f");+		+		if (v.index_of ("e") != -1) {	+			return "0.0";+		}+		+		return v;+	} }  }diff --git a/libsvgbird/SvgTransform.vala b/libsvgbird/SvgTransform.valaindex 7d8806b..773318d 100644--- a/libsvgbird/SvgTransform.vala+++ b/libsvgbird/SvgTransform.vala@@ -101,6 +101,42 @@ public class SvgTransform : GLib.Object { 		 		return matrix; 	}++	public string get_xml () {+		if (type == TransformType.SCALE) {+			if (arguments.size == 1) {+				string s = arguments.get_string (0);+				return @"scale ($s)";+			} else if (arguments.size == 2) {+				string s0 = arguments.get_string (0);+				string s1 = arguments.get_string (1);+				return @"scale ($s0, $s1)";+			}+		} else if (type == TransformType.TRANSLATE) {+			if (arguments.size == 1) {+				string s = arguments.get_string (0);+				return @"translate ($s)";+			} else if (arguments.size == 2) {+				string s0 = arguments.get_string (0);+				string s1 = arguments.get_string (1);+				return @"translate ($s0, $s1)";+			}+		} else if (type == TransformType.MATRIX) {+			if (arguments.size == 6) {+				string s0 = arguments.get_string (0);+				string s1 = arguments.get_string (1);+				string s2 = arguments.get_string (2);+				string s3 = arguments.get_string (3);					+				string s4 = arguments.get_string (4);+				string s5 = arguments.get_string (5);+				return @"matrix ($s0, $s1, $s2, $s3, $s4, $s5)";+			}+		}+		+		warning ("Invalid transform.");+		+		return "";+	} }  }diff --git a/libsvgbird/SvgTransforms.vala b/libsvgbird/SvgTransforms.valaindex 3ceab88..16fbb00 100644--- a/libsvgbird/SvgTransforms.vala+++ b/libsvgbird/SvgTransforms.vala@@ -109,6 +109,17 @@ public class SvgTransforms : GLib.Object { 		 		return sb.str; 	}+	+	public string get_xml () {+		StringBuilder svg = new StringBuilder ();+		+		foreach (SvgTransform transform in transforms) {+			svg.append (transform.get_xml ());+			svg.append (";");+		}+		+		return svg.str;+	} }  }

Contact

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