Commit c85ed33
Move gradient
Changed files (4)
modifiedlibbirdfont/TextRendering/fontconfig.cmodifiedlibsvgbird/Gradient.valamodifiedlibsvgbird/Object.valamodifiedlibsvgbird/text_drawing.c
Diff
@@ -118,7 +118,7 @@ gchar* find_font_file (FcConfig* font_config, const gchar* font_name) { FcPatternAddBool (search_pattern, FC_SCALABLE, FcTrue); FcPatternAddInteger (search_pattern, FC_WEIGHT, FC_WEIGHT_MEDIUM); FcPatternAddInteger (search_pattern, FC_SLANT, FC_SLANT_ROMAN);- + font_properties = FcObjectSetBuild (FC_FILE, NULL); fonts = FcFontList (font_config, search_pattern, font_properties); @@ -23,6 +23,7 @@ public abstract class Gradient : GLib.Object { public string id = ""; public string? href = null; public SvgTransforms transforms;+ public Matrix parent_matrix = Matrix.identity (); public Matrix view_matrix = Matrix.identity (); public Gradient () {@@ -36,6 +37,21 @@ public abstract class Gradient : GLib.Object { } } + public void move (double dx, double dy) {+ double x = dx;+ double y = dy;++ Matrix parent = parent_matrix;+ parent.invert ();+ parent.transform_distance (ref x, ref y);+ + Matrix m = Matrix.identity ();+ m.translate (-x, -y);+ + transforms.transforms.insert (0, new SvgTransform.for_matrix (m));+ transforms.collapse_transforms (); + }+ public Matrix get_matrix () { return transforms.get_matrix (); }@@ -118,12 +118,26 @@ public abstract class Object : GLib.Object { public abstract bool is_empty (); public virtual void move (double dx, double dy) {+ Gradient g;+ left += dx; right += dx; top += dy; bottom += dy;++ if (style.fill_gradient != null) {+ g = (!) style.fill_gradient;+ g.move (dx, dy);+ }+ + if (style.stroke_gradient != null) {+ g = (!) style.stroke_gradient;+ g.move (dx, dy);+ }+ to_object_distance (ref dx, ref dy); transforms.translate (dx, dy);+ update_view_matrix (); } @@ -234,6 +248,7 @@ public abstract class Object : GLib.Object { pattern.set_matrix (gradient_matrix); + g.parent_matrix = view_matrix; g.view_matrix = gradient_matrix; foreach (Stop s in g.stops) {@@ -259,7 +274,15 @@ public abstract class Object : GLib.Object { bool has_stroke = style.has_stroke (); apply_transform (context);-+ + if (style.fill_gradient != null) {+ apply_gradient (context, (!) style.fill_gradient);+ }+ + if (style.stroke_gradient != null) {+ apply_gradient (context, (!) style.stroke_gradient);+ }+ if (has_stroke) { context.set_line_width (style.stroke_width); } else {@@ -298,9 +321,9 @@ public abstract class Object : GLib.Object { public virtual bool update_boundaries_for_object () { ImageSurface surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, 1, 1); Context context = new Cairo.Context (surface);+ context.set_matrix (parent_matrix); return update_boundaries (context); }- } }@@ -233,6 +233,8 @@ gchar* svg_bird_find_font_file (const gchar* font_name) { // match any font as fallback search_pattern = FcPatternCreate ();+ FcPatternAddInteger (search_pattern, FC_SLANT, FC_SLANT_ROMAN);+ font_properties = FcObjectSetBuild (FC_FILE, NULL); fonts = FcFontList (font_config, search_pattern, font_properties);@@ -255,6 +257,10 @@ gchar* svg_bird_find_font_file (const gchar* font_name) { // search for a family name search_pattern = FcPatternCreate (); FcPatternAddString (search_pattern, FC_FAMILY, name);+ FcPatternAddInteger (search_pattern, FC_SLANT, FC_SLANT_ROMAN);+ FcPatternAddBool (search_pattern, FC_SCALABLE, FcTrue);+ FcPatternAddInteger (search_pattern, FC_WEIGHT, FC_WEIGHT_MEDIUM);+ fonts = FcFontList (font_config, search_pattern, font_properties); if (fonts->nfont > 0) {