Commit bd7708b
Convert embedded svg to xml
Changed files (7)
modifiedlibbirdfont/EmbeddedSvg.valamodifiedlibbirdfont/MoveTool.valamodifiedlibbirdfont/OpenFontFormat/SvgTable.valamodifiedlibbirdfont/SvgParser.valamodifiedlibsvgbird/Doubles.valamodifiedlibsvgbird/SvgTransform.valamodifiedlibsvgbird/SvgTransforms.vala
Diff
@@ -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;+ } } }@@ -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);- }+ } } } }@@ -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 ();@@ -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); }@@ -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;+ } } }@@ -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 "";+ } } }@@ -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;+ } } }