[librsvg] state: Store mask as reference



commit d1c9191949747f6dcfd207831d15dd4ba00e31f2
Author: Benjamin Otte <otte redhat com>
Date:   Wed Oct 7 05:31:08 2015 +0200

    state: Store mask as reference
    
    Instead of immediately looking up the mask, store the reference and look
    it up on use.

 rsvg-cairo-draw.c |    6 +++++-
 rsvg-mask.c       |   17 -----------------
 rsvg-mask.h       |    2 --
 rsvg-styles.c     |   12 ++++++++----
 rsvg-styles.h     |    2 +-
 5 files changed, 14 insertions(+), 25 deletions(-)
---
diff --git a/rsvg-cairo-draw.c b/rsvg-cairo-draw.c
index 61378a7..187ee4e 100644
--- a/rsvg-cairo-draw.c
+++ b/rsvg-cairo-draw.c
@@ -834,7 +834,11 @@ rsvg_cairo_pop_render_stack (RsvgDrawingCtx * ctx)
     cairo_set_operator (render->cr, state->comp_op);
 
     if (state->mask) {
-        rsvg_cairo_generate_mask (render->cr, state->mask, ctx, &render->bbox);
+        RsvgNode *mask;
+
+        mask = rsvg_defs_lookup (ctx->defs, state->mask);
+        if (mask && RSVG_NODE_TYPE (mask) == RSVG_NODE_TYPE_MASK)
+          rsvg_cairo_generate_mask (render->cr, (RsvgMask *) mask, ctx, &render->bbox);
     } else if (state->opacity != 0xFF)
         cairo_paint_with_alpha (render->cr, (double) state->opacity / 255.0);
     else
diff --git a/rsvg-mask.c b/rsvg-mask.c
index 8e3cba3..959ffa0 100644
--- a/rsvg-mask.c
+++ b/rsvg-mask.c
@@ -103,23 +103,6 @@ rsvg_get_url_string (const char *str)
 }
 
 RsvgNode *
-rsvg_mask_parse (const RsvgDefs * defs, const char *str)
-{
-    char *name;
-
-    name = rsvg_get_url_string (str);
-    if (name) {
-        RsvgNode *val;
-        val = rsvg_defs_lookup (defs, name);
-        g_free (name);
-
-        if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_MASK)
-            return val;
-    }
-    return NULL;
-}
-
-RsvgNode *
 rsvg_clip_path_parse (const RsvgDefs * defs, const char *str)
 {
     char *name;
diff --git a/rsvg-mask.h b/rsvg-mask.h
index ffadbd5..48bb7f0 100644
--- a/rsvg-mask.h
+++ b/rsvg-mask.h
@@ -48,8 +48,6 @@ struct _RsvgMask {
 
 G_GNUC_INTERNAL
 RsvgNode *rsvg_new_mask            (void);
-G_GNUC_INTERNAL
-RsvgNode *rsvg_mask_parse   (const RsvgDefs * defs, const char *str);
 
 typedef struct _RsvgClipPath RsvgClipPath;
 
diff --git a/rsvg-styles.c b/rsvg-styles.c
index 0b7baf5..1db34f4 100644
--- a/rsvg-styles.c
+++ b/rsvg-styles.c
@@ -221,6 +221,7 @@ rsvg_state_clone (RsvgState * dst, const RsvgState * src)
 
     *dst = *src;
     dst->parent = parent;
+    dst->mask = g_strdup (src->mask);
     dst->font_family = g_strdup (src->font_family);
     dst->lang = g_strdup (src->lang);
     rsvg_paint_server_ref (dst->fill);
@@ -356,7 +357,8 @@ rsvg_state_inherit_run (RsvgState * dst, const RsvgState * src,
 
     if (inherituninheritables) {
         dst->clip_path_ref = src->clip_path_ref;
-        dst->mask = src->mask;
+        g_free (dst->mask);
+        dst->mask = g_strdup (src->mask);
         dst->enable_background = src->enable_background;
         dst->adobe_blend = src->adobe_blend;
         dst->opacity = src->opacity;
@@ -444,6 +446,7 @@ rsvg_state_inherit (RsvgState * dst, const RsvgState * src)
 void
 rsvg_state_finalize (RsvgState * state)
 {
+    g_free (state->mask);
     g_free (state->font_family);
     g_free (state->lang);
     rsvg_paint_server_unref (state->fill);
@@ -517,9 +520,10 @@ rsvg_parse_style_pair (RsvgHandle * ctx,
             state->adobe_blend = 11;
         else
             state->adobe_blend = 0;
-    } else if (g_str_equal (name, "mask"))
-        state->mask = rsvg_mask_parse (ctx->priv->defs, value);
-    else if (g_str_equal (name, "clip-path")) {
+    } else if (g_str_equal (name, "mask")) {
+        g_free (state->mask);
+        state->mask = rsvg_get_url_string (value);
+    } else if (g_str_equal (name, "clip-path")) {
         state->clip_path_ref = rsvg_clip_path_parse (ctx->priv->defs, value);
     } else if (g_str_equal (name, "overflow")) {
         if (!g_str_equal (value, "inherit")) {
diff --git a/rsvg-styles.h b/rsvg-styles.h
index e5ae5d2..472a6c0 100644
--- a/rsvg-styles.h
+++ b/rsvg-styles.h
@@ -80,7 +80,7 @@ struct _RsvgState {
     cairo_matrix_t personal_affine;
 
     RsvgFilter *filter;
-    void *mask;
+    char *mask;
     void *clip_path_ref;
     guint8 adobe_blend;         /* 0..11 */
     guint8 opacity;             /* 0..255 */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]