summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaleb Michael Moore <cmoore@src.gnome.org>2005-05-15 17:53:10 +0000
committerCaleb Michael Moore <cmoore@src.gnome.org>2005-05-15 17:53:10 +0000
commitcf2e610b3469e5a29194225accd5c06c225b2047 (patch)
tree6e414c89c6edd3d4e9ace03066013643cd437149
parente3a24a0fb92e39db17c71591e1973614c41d01ff (diff)
downloadlibrsvg-cf2e610b3469e5a29194225accd5c06c225b2047.tar.gz
more DOM stuff
-rw-r--r--ChangeLog4
-rw-r--r--rsvg-art-mask.c9
-rw-r--r--rsvg-filter.c529
-rw-r--r--rsvg-filter.h37
-rw-r--r--rsvg-mask.c158
-rw-r--r--rsvg-mask.h16
-rw-r--r--rsvg-private.h4
-rw-r--r--rsvg-structure.c370
-rw-r--r--rsvg-structure.h20
-rw-r--r--rsvg.c116
10 files changed, 673 insertions, 590 deletions
diff --git a/ChangeLog b/ChangeLog
index 4003bfdc..65879564 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-05-16 Caleb Moore <c.moore@student.unsw.edu.au>
+
+ * rsvg-filter.c, rsvg-structure.c, rsvg-mask.c, rsvg.c: more DOM stuff. Now orthodox nodes are created, then attributes are assigned then are packed onto the top of the tree. I have moved all conforming node creation bits to rsvg-filter-handler-start so I remember what's left to convert. Probably opened a few bugs, you know how it is. Theoretically, it is now possible to implement external DOM interfaces to create new nodes and add nodes to other nodes. Attributes can be edited as much as the user wants for many elements now.
+
2005-05-14 Dom Lachowicz <cinamod@hotmail.com>
* rsvg-filter.c: Bug 302905
diff --git a/rsvg-art-mask.c b/rsvg-art-mask.c
index 96e4a90c..8dc76569 100644
--- a/rsvg-art-mask.c
+++ b/rsvg-art-mask.c
@@ -106,14 +106,14 @@ ArtSVP *
rsvg_art_clip_path_render (RsvgClipPath * self, RsvgDrawingCtx *ctx)
{
RsvgState *state = rsvg_state_current (ctx);
- RsvgNodeGroup *group = (RsvgNodeGroup*)self;
+ RsvgClipPath *group = (RsvgClipPath*)self;
guint i;
ArtSVP *svp;
RsvgArtSVPRender * asvpr;
RsvgRender * save;
- rsvg_state_reinherit_top(ctx, self->super.super.state, 0);
+ rsvg_state_reinherit_top(ctx, self->super.state, 0);
if (self->units == objectBoundingBox)
{
@@ -154,9 +154,6 @@ rsvg_art_mask_render (RsvgMask *self, GdkPixbuf *tos, GdkPixbuf *nos, RsvgDrawin
int x, y;
GdkPixbuf *save, *mask;
- RsvgNode *drawable;
-
- drawable = (RsvgNode*)self;
mask = _rsvg_pixbuf_new_cleared(GDK_COLORSPACE_RGB, 1, 8,
gdk_pixbuf_get_width(tos),
@@ -166,7 +163,7 @@ rsvg_art_mask_render (RsvgMask *self, GdkPixbuf *tos, GdkPixbuf *nos, RsvgDrawin
((RsvgArtRender *)ctx->render)->pixbuf = mask;
rsvg_state_push(ctx);
- rsvg_node_draw (drawable, ctx, 0);
+ rsvg_node_mask_draw (self, ctx, 0);
rsvg_state_pop(ctx);
((RsvgArtRender *)ctx->render)->pixbuf = save;
diff --git a/rsvg-filter.c b/rsvg-filter.c
index a0310500..91713796 100644
--- a/rsvg-filter.c
+++ b/rsvg-filter.c
@@ -550,49 +550,15 @@ rsvg_filter_free (RsvgNode * dself)
g_ptr_array_free(self->primitives, FALSE);
}
-/**
- * rsvg_new_filter: Creates a black filter
- *
- * Creates a blank filter and assigns default values to everything
- **/
-static RsvgFilter *
-rsvg_new_filter (void)
-{
- RsvgFilter *filter;
-
- filter = g_new (RsvgFilter, 1);
- filter->filterunits = objectBoundingBox;
- filter->primitiveunits = userSpaceOnUse;
- filter->x = -0.1;
- filter->y = -0.1;
- filter->width = 1.2;
- filter->height = 1.2;
- filter->primitives = g_ptr_array_new ();
- filter->super.type = RSVG_NODE_FILTER;
- filter->super.free = rsvg_filter_free;
- filter->super.add_child = rsvg_filter_add_child;
- return filter;
-}
-
-/**
- * rsvg_start_filter: Create a filter from xml arguments.
- * @ctx: the current rsvg handle
- * @atts: the xml attributes that set the filter's properties
- *
- * Creates a new filter and sets it as a def
- * Also sets the context's current filter pointer to point to the
- * newly created filter so that all subsiquent primatives are
- * added to this filter until the filter is ended
- **/
-RsvgNode *
-rsvg_start_filter (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_set_args (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
RsvgFilter *filter;
double font_size;
font_size = rsvg_state_current_font_size (ctx);
- filter = rsvg_new_filter ();
+ filter = (RsvgFilter *)self;
if (rsvg_property_bag_size (atts))
{
@@ -637,7 +603,31 @@ rsvg_start_filter (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super);
}
- return (RsvgNode *)filter;
+}
+
+/**
+ * rsvg_new_filter: Creates a black filter
+ *
+ * Creates a blank filter and assigns default values to everything
+ **/
+RsvgNode *
+rsvg_new_filter (void)
+{
+ RsvgFilter *filter;
+
+ filter = g_new (RsvgFilter, 1);
+ filter->filterunits = objectBoundingBox;
+ filter->primitiveunits = userSpaceOnUse;
+ filter->x = -0.1;
+ filter->y = -0.1;
+ filter->width = 1.2;
+ filter->height = 1.2;
+ filter->primitives = g_ptr_array_new ();
+ filter->super.type = RSVG_NODE_FILTER;
+ filter->super.free = rsvg_filter_free;
+ filter->super.add_child = rsvg_filter_add_child;
+ filter->super.set_atts = rsvg_filter_set_args;
+ return &filter->super;
}
/**
@@ -877,8 +867,8 @@ rsvg_filter_primitive_blend_free (RsvgNode * self)
g_free (bself);
}
-RsvgNode *
-rsvg_start_filter_primitive_blend (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_blend_set_atts (RsvgNode * node, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *id = NULL, *value;
double font_size;
@@ -886,12 +876,7 @@ rsvg_start_filter_primitive_blend (RsvgHandle * ctx, RsvgPropertyBag * atts)
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveBlend, 1);
- filter->mode = normal;
- filter->super.in = g_string_new ("none");
- filter->in2 = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
+ filter = (RsvgFilterPrimitiveBlend *)node;
if (rsvg_property_bag_size (atts))
{
@@ -953,10 +938,22 @@ rsvg_start_filter_primitive_blend (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, id, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_blend (void)
+{
+ RsvgFilterPrimitiveBlend *filter;
+ filter = g_new (RsvgFilterPrimitiveBlend, 1);
+ filter->mode = normal;
+ filter->super.in = g_string_new ("none");
+ filter->in2 = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
filter->super.render = &rsvg_filter_primitive_blend_render;
filter->super.super.free = &rsvg_filter_primitive_blend_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_blend_set_atts;
return (RsvgNode *)filter;
}
@@ -1100,9 +1097,10 @@ rsvg_filter_primitive_convolve_matrix_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_convolve_matrix (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_convolve_matrix_set_atts (RsvgNode * self,
+ RsvgHandle * ctx,
+ RsvgPropertyBag * atts)
{
gint i, j;
guint listlen;
@@ -1112,21 +1110,9 @@ rsvg_start_filter_primitive_convolve_matrix (RsvgHandle * ctx,
RsvgFilterPrimitiveConvolveMatrix *filter;
font_size = rsvg_state_current_font_size (ctx);
-
- filter = g_new (RsvgFilterPrimitiveConvolveMatrix, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
-
- filter->divisor = 0;
- filter->bias = 0;
+ filter = (RsvgFilterPrimitiveConvolveMatrix*)self;
has_target_x = 0;
has_target_y = 0;
- filter->dx = 0;
- filter->dy = 0;
- filter->preservealpha = FALSE;
- filter->edgemode = 0;
if (rsvg_property_bag_size (atts))
{
@@ -1242,10 +1228,26 @@ rsvg_start_filter_primitive_convolve_matrix (RsvgHandle * ctx,
{
filter->targety = floor(filter->ordery / 2);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_convolve_matrix(void)
+{
+ RsvgFilterPrimitiveConvolveMatrix *filter;
+ filter = g_new (RsvgFilterPrimitiveConvolveMatrix, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->divisor = 0;
+ filter->bias = 0;
+ filter->dx = 0;
+ filter->dy = 0;
+ filter->preservealpha = FALSE;
+ filter->edgemode = 0;
filter->super.render = &rsvg_filter_primitive_convolve_matrix_render;
filter->super.super.free = &rsvg_filter_primitive_convolve_matrix_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_convolve_matrix_set_atts;
return (RsvgNode *)filter;
}
@@ -1553,9 +1555,10 @@ rsvg_filter_primitive_gaussian_blur_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_gaussian_blur (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_gaussian_blur_set_atts (RsvgNode * self,
+ RsvgHandle * ctx,
+ RsvgPropertyBag * atts)
{
const char *id = NULL, *value;
double font_size;
@@ -1563,13 +1566,7 @@ rsvg_start_filter_primitive_gaussian_blur (RsvgHandle * ctx,
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveGaussianBlur, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->sdx = 0;
- filter->sdy = 0;
+ filter = (RsvgFilterPrimitiveGaussianBlur *)self;
if (rsvg_property_bag_size (atts))
{
@@ -1620,10 +1617,22 @@ rsvg_start_filter_primitive_gaussian_blur (RsvgHandle * ctx,
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, id, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_gaussian_blur(void)
+{
+ RsvgFilterPrimitiveGaussianBlur *filter;
+ filter = g_new (RsvgFilterPrimitiveGaussianBlur, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->sdx = 0;
+ filter->sdy = 0;
filter->super.render = &rsvg_filter_primitive_gaussian_blur_render;
filter->super.super.free = &rsvg_filter_primitive_gaussian_blur_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_gaussian_blur_set_atts;
return (RsvgNode *)filter;
}
@@ -1715,8 +1724,8 @@ rsvg_filter_primitive_offset_free (RsvgNode * self)
g_free (oself);
}
-RsvgNode *
-rsvg_start_filter_primitive_offset (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_offset_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *id = NULL, *value;
double font_size;
@@ -1724,13 +1733,7 @@ rsvg_start_filter_primitive_offset (RsvgHandle * ctx, RsvgPropertyBag * atts)
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveOffset, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->dy = 0;
- filter->dx = 0;
+ filter = (RsvgFilterPrimitiveOffset *)self;
if (rsvg_property_bag_size (atts))
{
@@ -1789,10 +1792,22 @@ rsvg_start_filter_primitive_offset (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, id, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_offset (void)
+{
+ RsvgFilterPrimitiveOffset *filter;
+ filter = g_new (RsvgFilterPrimitiveOffset, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->dy = 0;
+ filter->dx = 0;
filter->super.render = &rsvg_filter_primitive_offset_render;
filter->super.super.free = &rsvg_filter_primitive_offset_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_offset_set_atts;
return (RsvgNode *)filter;
}
@@ -1853,8 +1868,8 @@ rsvg_filter_primitive_merge_free (RsvgNode * self)
g_free (mself);
}
-RsvgNode *
-rsvg_start_filter_primitive_merge (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_merge_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *id = NULL, *value;
double font_size;
@@ -1862,11 +1877,7 @@ rsvg_start_filter_primitive_merge (RsvgHandle * ctx, RsvgPropertyBag * atts)
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveMerge, 1);
-
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->nodes = g_ptr_array_new ();
+ filter = (RsvgFilterPrimitiveMerge *)self;
if (rsvg_property_bag_size (atts))
{
@@ -1911,10 +1922,20 @@ rsvg_start_filter_primitive_merge (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, id, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_merge (void)
+{
+ RsvgFilterPrimitiveMerge *filter;
+ filter = g_new (RsvgFilterPrimitiveMerge, 1);
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->nodes = g_ptr_array_new ();
filter->super.render = &rsvg_filter_primitive_merge_render;
filter->super.super.free = &rsvg_filter_primitive_merge_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_merge_set_atts;
return (RsvgNode *)filter;
}
@@ -2039,9 +2060,8 @@ rsvg_filter_primitive_colour_matrix_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_colour_matrix (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_colour_matrix_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
gint type;
guint listlen;
@@ -2051,14 +2071,8 @@ rsvg_start_filter_primitive_colour_matrix (RsvgHandle * ctx,
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveColourMatrix, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
+ filter = (RsvgFilterPrimitiveColourMatrix *)self;
- filter->KernelMatrix = NULL;
-
type = 0;
if (rsvg_property_bag_size (atts))
@@ -2200,13 +2214,25 @@ rsvg_start_filter_primitive_colour_matrix (RsvgHandle * ctx,
{
g_assert_not_reached();
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_colour_matrix (void)
+{
+ RsvgFilterPrimitiveColourMatrix *filter;
+ filter = g_new (RsvgFilterPrimitiveColourMatrix, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->KernelMatrix = NULL;
filter->super.render = &rsvg_filter_primitive_colour_matrix_render;
filter->super.super.free = &rsvg_filter_primitive_colour_matrix_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_colour_matrix_set_atts;
return (RsvgNode *)filter;
}
+
/*************************************************************/
/*************************************************************/
@@ -2405,30 +2431,15 @@ rsvg_filter_primitive_component_transfer_free (RsvgNode * self)
g_free (cself);
}
-
-RsvgNode *
-rsvg_start_filter_primitive_component_transfer (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_component_transfer_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
double font_size;
const char *value;
RsvgFilterPrimitiveComponentTransfer *filter;
font_size = rsvg_state_current_font_size (ctx);
-
- filter = g_new (RsvgFilterPrimitiveComponentTransfer, 1);
-
- filter->super.result = g_string_new ("none");
- filter->super.in = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->Rfunction = identity_component_transfer_func;
- filter->Gfunction = identity_component_transfer_func;
- filter->Bfunction = identity_component_transfer_func;
- filter->Afunction = identity_component_transfer_func;
- filter->Rdata.nbTableValues = 0;
- filter->Gdata.nbTableValues = 0;
- filter->Bdata.nbTableValues = 0;
- filter->Adata.nbTableValues = 0;
+ filter = (RsvgFilterPrimitiveComponentTransfer *)self;
if (rsvg_property_bag_size (atts))
{
@@ -2475,10 +2486,29 @@ rsvg_start_filter_primitive_component_transfer (RsvgHandle * ctx,
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_component_transfer (void)
+{
+ RsvgFilterPrimitiveComponentTransfer *filter;
+
+ filter = g_new (RsvgFilterPrimitiveComponentTransfer, 1);
+ filter->super.result = g_string_new ("none");
+ filter->super.in = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->Rfunction = identity_component_transfer_func;
+ filter->Gfunction = identity_component_transfer_func;
+ filter->Bfunction = identity_component_transfer_func;
+ filter->Afunction = identity_component_transfer_func;
+ filter->Rdata.nbTableValues = 0;
+ filter->Gdata.nbTableValues = 0;
+ filter->Bdata.nbTableValues = 0;
+ filter->Adata.nbTableValues = 0;
filter->super.render = &rsvg_filter_primitive_component_transfer_render;
filter->super.super.free = &rsvg_filter_primitive_component_transfer_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_component_transfer_set_atts;
return (RsvgNode *)filter;
}
@@ -2667,9 +2697,8 @@ rsvg_filter_primitive_erode_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_erode (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_erode_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
@@ -2678,14 +2707,7 @@ rsvg_start_filter_primitive_erode (RsvgHandle * ctx,
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveErode, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->rx = 0;
- filter->ry = 0;
- filter->mode = 0;
+ filter = (RsvgFilterPrimitiveErode *)self;
if (rsvg_property_bag_size (atts))
{
@@ -2745,10 +2767,23 @@ rsvg_start_filter_primitive_erode (RsvgHandle * ctx,
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_erode (void)
+{
+ RsvgFilterPrimitiveErode *filter;
+ filter = g_new (RsvgFilterPrimitiveErode, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->rx = 0;
+ filter->ry = 0;
+ filter->mode = 0;
filter->super.render = &rsvg_filter_primitive_erode_render;
filter->super.super.free = &rsvg_filter_primitive_erode_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_erode_set_atts;
return (RsvgNode *)filter;
}
@@ -2917,8 +2952,8 @@ rsvg_filter_primitive_composite_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_composite (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_composite_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
double font_size;
const char *value;
@@ -2926,16 +2961,7 @@ rsvg_start_filter_primitive_composite (RsvgHandle * ctx, RsvgPropertyBag * atts)
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveComposite, 1);
- filter->mode = COMPOSITE_MODE_OVER;
- filter->super.in = g_string_new ("none");
- filter->in2 = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->k1 = 0;
- filter->k2 = 0;
- filter->k3 = 0;
- filter->k4 = 0;
+ filter = (RsvgFilterPrimitiveComposite *)self;
if (rsvg_property_bag_size (atts))
{
@@ -3016,14 +3042,29 @@ rsvg_start_filter_primitive_composite (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_composite (void)
+{
+ RsvgFilterPrimitiveComposite *filter;
+ filter = g_new (RsvgFilterPrimitiveComposite, 1);
+ filter->mode = COMPOSITE_MODE_OVER;
+ filter->super.in = g_string_new ("none");
+ filter->in2 = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->k1 = 0;
+ filter->k2 = 0;
+ filter->k3 = 0;
+ filter->k4 = 0;
filter->super.render = &rsvg_filter_primitive_composite_render;
filter->super.super.free = &rsvg_filter_primitive_composite_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_composite_set_atts;
return (RsvgNode *)filter;
}
-
/*************************************************************/
/*************************************************************/
@@ -3098,9 +3139,8 @@ rsvg_filter_primitive_flood_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_flood (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_flood_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -3108,15 +3148,8 @@ rsvg_start_filter_primitive_flood (RsvgHandle * ctx,
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveFlood, 1);
+ filter = (RsvgFilterPrimitiveFlood *)self;
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
-
- filter->opacity = 255;
- filter->colour = 0;
-
if (rsvg_property_bag_size (atts))
{
if ((value = rsvg_property_bag_lookup (atts, "result")))
@@ -3168,10 +3201,22 @@ rsvg_start_filter_primitive_flood (RsvgHandle * ctx,
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_flood (void)
+{
+ RsvgFilterPrimitiveFlood *filter;
+ filter = g_new (RsvgFilterPrimitiveFlood, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->opacity = 255;
+ filter->colour = 0;
filter->super.render = &rsvg_filter_primitive_flood_render;
filter->super.super.free = &rsvg_filter_primitive_flood_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_flood_set_atts;
return (RsvgNode *)filter;
}
@@ -3306,8 +3351,8 @@ rsvg_filter_primitive_displacement_map_free (RsvgNode * self)
g_free (dself);
}
-RsvgNode *
-rsvg_start_filter_primitive_displacement_map (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_displacement_map_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -3315,15 +3360,7 @@ rsvg_start_filter_primitive_displacement_map (RsvgHandle * ctx, RsvgPropertyBag
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveDisplacementMap, 1);
-
- filter->super.in = g_string_new ("none");
- filter->in2 = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->xChannelSelector = ' ';
- filter->yChannelSelector = ' ';
- filter->scale = 0;
+ filter = (RsvgFilterPrimitiveDisplacementMap *)self;
if (rsvg_property_bag_size (atts))
{
@@ -3378,10 +3415,24 @@ rsvg_start_filter_primitive_displacement_map (RsvgHandle * ctx, RsvgPropertyBag
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_displacement_map ()
+{
+ RsvgFilterPrimitiveDisplacementMap *filter;
+ filter = g_new (RsvgFilterPrimitiveDisplacementMap, 1);
+ filter->super.in = g_string_new ("none");
+ filter->in2 = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->xChannelSelector = ' ';
+ filter->yChannelSelector = ' ';
+ filter->scale = 0;
filter->super.render = &rsvg_filter_primitive_displacement_map_render;
filter->super.super.free = &rsvg_filter_primitive_displacement_map_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_displacement_map_set_atts;
return (RsvgNode *)filter;
}
@@ -3687,8 +3738,8 @@ rsvg_filter_primitive_turbulence_free (RsvgNode * self)
g_free (tself);
}
-RsvgNode *
-rsvg_start_filter_primitive_turbulence (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_turbulence_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -3696,19 +3747,7 @@ rsvg_start_filter_primitive_turbulence (RsvgHandle * ctx, RsvgPropertyBag * atts
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveTurbulence, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->fBaseFreqX = 0;
- filter->fBaseFreqY = 0;
- filter->nNumOctaves = 1;
- filter->seed = 0;
- filter->bDoStitching = 0;
- filter->bFractalSum = 0;
-
- feTurbulence_init(filter);
+ filter = (RsvgFilterPrimitiveTurbulence *)self;
if (rsvg_property_bag_size (atts))
{
@@ -3765,13 +3804,31 @@ rsvg_start_filter_primitive_turbulence (RsvgHandle * ctx, RsvgPropertyBag * atts
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_turbulence (void)
+{
+ RsvgFilterPrimitiveTurbulence *filter;
+ filter = g_new (RsvgFilterPrimitiveTurbulence, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->fBaseFreqX = 0;
+ filter->fBaseFreqY = 0;
+ filter->nNumOctaves = 1;
+ filter->seed = 0;
+ filter->bDoStitching = 0;
+ filter->bFractalSum = 0;
+ feTurbulence_init(filter);
filter->super.render = &rsvg_filter_primitive_turbulence_render;
filter->super.super.free = &rsvg_filter_primitive_turbulence_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_turbulence_set_atts;
return (RsvgNode *)filter;
}
+
/*************************************************************/
/*************************************************************/
@@ -3937,8 +3994,8 @@ rsvg_filter_primitive_image_free (RsvgNode * self)
g_free (oself);
}
-RsvgNode *
-rsvg_start_filter_primitive_image (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_image_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -3946,13 +4003,9 @@ rsvg_start_filter_primitive_image (RsvgHandle * ctx, RsvgPropertyBag * atts)
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveImage, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->ctx = ctx;
-
+ filter = (RsvgFilterPrimitiveImage*)self;
+ filter->ctx = ctx;
+
if (rsvg_property_bag_size (atts))
{
if ((value = rsvg_property_bag_lookup (atts, "in")))
@@ -4003,10 +4056,20 @@ rsvg_start_filter_primitive_image (RsvgHandle * ctx, RsvgPropertyBag * atts)
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
-
+}
+
+RsvgNode *
+rsvg_new_filter_primitive_image (void)
+{
+ RsvgFilterPrimitiveImage *filter;
+ filter = g_new (RsvgFilterPrimitiveImage, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
filter->super.render = &rsvg_filter_primitive_image_render;
filter->super.super.free = &rsvg_filter_primitive_image_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_image_set_atts;
return (RsvgNode *)filter;
}
@@ -4527,8 +4590,8 @@ rsvg_filter_primitive_diffuse_lighting_free (RsvgNode * self)
g_free (oself);
}
-RsvgNode *
-rsvg_start_filter_primitive_diffuse_lighting (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_diffuse_lighting_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -4536,16 +4599,8 @@ rsvg_start_filter_primitive_diffuse_lighting (RsvgHandle * ctx, RsvgPropertyBag
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveDiffuseLighting, 1);
+ filter = (RsvgFilterPrimitiveDiffuseLighting *)self;
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->surfaceScale = 1;
- filter->diffuseConstant = 1;
- filter->dx = 1;
- filter->dy = 1;
- filter->lightingcolour = 0xFFFFFFFF;
if (rsvg_property_bag_size (atts))
{
@@ -4603,14 +4658,28 @@ rsvg_start_filter_primitive_diffuse_lighting (RsvgHandle * ctx, RsvgPropertyBag
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_diffuse_lighting (void)
+{
+ RsvgFilterPrimitiveDiffuseLighting *filter;
+ filter = g_new (RsvgFilterPrimitiveDiffuseLighting, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->surfaceScale = 1;
+ filter->diffuseConstant = 1;
+ filter->dx = 1;
+ filter->dy = 1;
+ filter->lightingcolour = 0xFFFFFFFF;
filter->super.render = &rsvg_filter_primitive_diffuse_lighting_render;
filter->super.super.free = &rsvg_filter_primitive_diffuse_lighting_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_diffuse_lighting_set_atts;
return (RsvgNode *)filter;
}
-
/*************************************************************/
/*************************************************************/
@@ -4731,8 +4800,8 @@ rsvg_filter_primitive_specular_lighting_free (RsvgNode * self)
g_free (oself);
}
-RsvgNode *
-rsvg_start_filter_primitive_specular_lighting (RsvgHandle * ctx, RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_specular_lighting_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -4740,15 +4809,7 @@ rsvg_start_filter_primitive_specular_lighting (RsvgHandle * ctx, RsvgPropertyBag
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveSpecularLighting, 1);
-
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
- filter->surfaceScale = 1;
- filter->specularConstant = 1;
- filter->specularExponent = 1;
- filter->lightingcolour = 0xFFFFFFFF;
+ filter = (RsvgFilterPrimitiveSpecularLighting *)self;
if (rsvg_property_bag_size (atts))
{
@@ -4806,10 +4867,25 @@ rsvg_start_filter_primitive_specular_lighting (RsvgHandle * ctx, RsvgPropertyBag
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
-
+}
+
+
+RsvgNode *
+rsvg_new_filter_primitive_specular_lighting (void)
+{
+ RsvgFilterPrimitiveSpecularLighting *filter;
+ filter = g_new (RsvgFilterPrimitiveSpecularLighting, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
+ filter->surfaceScale = 1;
+ filter->specularConstant = 1;
+ filter->specularExponent = 1;
+ filter->lightingcolour = 0xFFFFFFFF;
filter->super.render = &rsvg_filter_primitive_specular_lighting_render;
filter->super.super.free = &rsvg_filter_primitive_specular_lighting_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_specular_lighting_set_atts;
return (RsvgNode *)filter;
}
@@ -4892,9 +4968,8 @@ rsvg_filter_primitive_tile_free (RsvgNode * self)
g_free (cself);
}
-RsvgNode *
-rsvg_start_filter_primitive_tile (RsvgHandle * ctx,
- RsvgPropertyBag * atts)
+static void
+rsvg_filter_primitive_tile_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
{
const char *value;
double font_size;
@@ -4902,12 +4977,8 @@ rsvg_start_filter_primitive_tile (RsvgHandle * ctx,
font_size = rsvg_state_current_font_size (ctx);
- filter = g_new (RsvgFilterPrimitiveTile, 1);
+ filter = (RsvgFilterPrimitiveTile*)self;
- filter->super.in = g_string_new ("none");
- filter->super.result = g_string_new ("none");
- filter->super.sizedefaults = 1;
-
if (rsvg_property_bag_size (atts))
{
if ((value = rsvg_property_bag_lookup (atts, "in")))
@@ -4953,9 +5024,19 @@ rsvg_start_filter_primitive_tile (RsvgHandle * ctx,
if ((value = rsvg_property_bag_lookup (atts, "id")))
rsvg_defs_register_name (ctx->defs, value, &filter->super.super);
}
+}
+RsvgNode *
+rsvg_new_filter_primitive_tile (void)
+{
+ RsvgFilterPrimitiveTile *filter;
+ filter = g_new (RsvgFilterPrimitiveTile, 1);
+ filter->super.in = g_string_new ("none");
+ filter->super.result = g_string_new ("none");
+ filter->super.sizedefaults = 1;
filter->super.render = &rsvg_filter_primitive_tile_render;
filter->super.super.free = &rsvg_filter_primitive_tile_free;
filter->super.super.type = RSVG_NODE_FILTER_PRIMITIVE;
+ filter->super.super.set_atts = rsvg_filter_primitive_tile_set_atts;
return (RsvgNode *)filter;
}
diff --git a/rsvg-filter.h b/rsvg-filter.h
index b8f8a374..f341454c 100644
--- a/rsvg-filter.h
+++ b/rsvg-filter.h
@@ -46,7 +46,7 @@ void
rsvg_filter_render (RsvgFilter *self, GdkPixbuf *source, GdkPixbuf *output, GdkPixbuf *bg, RsvgDrawingCtx *context);
RsvgNode *
-rsvg_start_filter (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter (void);
void
rsvg_end_filter (RsvgHandle *ctx);
@@ -55,66 +55,63 @@ RsvgFilter *
rsvg_filter_parse (const RsvgDefs *defs, const char *str);
RsvgNode *
-rsvg_start_filter_primitive_blend (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_blend (void);
RsvgNode *
-rsvg_start_filter_primitive_convolve_matrix (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_convolve_matrix (void);
RsvgNode *
-rsvg_start_filter_primitive_gaussian_blur (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_gaussian_blur (void);
RsvgNode *
-rsvg_start_filter_primitive_offset (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_offset (void);
RsvgNode *
-rsvg_start_filter_primitive_merge (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_merge (void);
void
rsvg_start_filter_primitive_merge_node (RsvgHandle *ctx, RsvgPropertyBag *atts);
RsvgNode *
-rsvg_start_filter_primitive_colour_matrix (RsvgHandle *ctx, RsvgPropertyBag *atts);
+rsvg_new_filter_primitive_colour_matrix (void);
RsvgNode *
-rsvg_start_filter_primitive_component_transfer (RsvgHandle * ctx,
- RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_component_transfer (void);
void
rsvg_start_filter_primitive_component_transfer_function (RsvgHandle * ctx,
RsvgPropertyBag * atts, char channel);
RsvgNode *
-rsvg_start_filter_primitive_erode (RsvgHandle * ctx,
- RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_erode (void);
RsvgNode *
-rsvg_start_filter_primitive_composite (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_composite (void);
RsvgNode *
-rsvg_start_filter_primitive_flood (RsvgHandle * ctx,
- RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_flood (void);
RsvgNode *
-rsvg_start_filter_primitive_displacement_map (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_displacement_map (void);
RsvgNode *
-rsvg_start_filter_primitive_turbulence (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_turbulence (void);
RsvgNode *
-rsvg_start_filter_primitive_image (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_image (void);
RsvgNode *
-rsvg_start_filter_primitive_diffuse_lighting (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_diffuse_lighting (void);
void
rsvg_start_filter_primitive_light_source (RsvgHandle * ctx,
RsvgPropertyBag * atts, char type);
RsvgNode *
-rsvg_start_filter_primitive_specular_lighting (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_specular_lighting (void);
RsvgNode *
-rsvg_start_filter_primitive_tile (RsvgHandle * ctx, RsvgPropertyBag * atts);
+rsvg_new_filter_primitive_tile (void);
void
rsvg_filter_adobe_blend(gint modenum, GdkPixbuf *in, GdkPixbuf *bg, GdkPixbuf *output,
diff --git a/rsvg-mask.c b/rsvg-mask.c
index 6224cecc..c1afc492 100644
--- a/rsvg-mask.c
+++ b/rsvg-mask.c
@@ -32,20 +32,19 @@ static void
rsvg_mask_free (RsvgNode * self)
{
RsvgMask *z = (RsvgMask *)self;
- g_ptr_array_free(z->super.children, TRUE);
- rsvg_state_finalize (z->super.super.state);
- g_free(z->super.super.state);
+ g_ptr_array_free(z->children, TRUE);
+ rsvg_state_finalize (z->super.state);
+ g_free(z->super.state);
g_free (z);
}
-static void
-rsvg_node_mask_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
- int dominate)
+void
+rsvg_node_mask_draw (RsvgMask *group, RsvgDrawingCtx *ctx,
+ int dominate)
{
- RsvgNodeGroup *group = (RsvgNodeGroup*)self;
guint i;
- rsvg_state_reinherit_top(ctx, self->state, 0);
+ rsvg_state_reinherit_top(ctx, group->super.state, 0);
rsvg_push_discrete_layer (ctx);
@@ -53,8 +52,7 @@ rsvg_node_mask_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
{
rsvg_state_push(ctx);
- rsvg_node_draw (g_ptr_array_index(group->children, i),
- ctx, 0);
+ rsvg_node_draw (g_ptr_array_index(group->children, i), ctx, 0);
rsvg_state_pop(ctx);
}
@@ -62,37 +60,15 @@ rsvg_node_mask_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
rsvg_pop_discrete_layer (ctx);
}
-
-static RsvgMask *
-rsvg_new_mask (void)
-{
- RsvgMask *mask;
-
- mask = g_new (RsvgMask, 1);
- mask->maskunits = objectBoundingBox;
- mask->contentunits = userSpaceOnUse;
- mask->x = 0;
- mask->y = 0;
- mask->width = 1;
- mask->height = 1;
- mask->super.super.state = g_new(RsvgState, 1);
- mask->super.children = g_ptr_array_new ();
- mask->super.super.type = RSVG_NODE_MASK;
- mask->super.super.free = rsvg_mask_free;
- mask->super.super.draw = rsvg_node_mask_draw;
- mask->super.super.add_child = rsvg_node_group_add_child;
- return mask;
-}
-
-void
-rsvg_start_mask (RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_mask_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
const char *id = NULL, *klazz = NULL, *value;
RsvgMask *mask;
double font_size;
font_size = rsvg_state_current_font_size (ctx);
- mask = rsvg_new_mask ();
+ mask = (RsvgMask *)self;
if (rsvg_property_bag_size (atts))
{
@@ -133,22 +109,55 @@ rsvg_start_mask (RsvgHandle *ctx, RsvgPropertyBag *atts)
rsvg_css_parse_normalized_length (value,
ctx->dpi_y,
1,
- font_size);
+ font_size);
if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+ {
+ id = value;
+ rsvg_defs_register_name(ctx->defs, id, &mask->super);
+ }
if ((value = rsvg_property_bag_lookup (atts, "class")))
klazz = value;
}
+ rsvg_parse_style_attrs (ctx, mask->super.state, "mask", klazz, id, atts);
+}
- rsvg_state_init(mask->super.super.state);
- rsvg_parse_style_attrs (ctx, mask->super.super.state, "mask", klazz, id, atts);
-
- mask->super.super.parent = (RsvgNode *)ctx->currentnode;
+static void
+rsvg_mask_add_child (RsvgNode *overself, RsvgNode *child)
+{
+ RsvgMask *self = (RsvgMask *)overself;
+ if (self == NULL)
+ return;
+ g_ptr_array_add(self->children, child);
+}
- ctx->currentnode = &mask->super.super;
+static void
+rsvg_draw_nothing (RsvgNode * self, RsvgDrawingCtx *ctx,
+ int dominate)
+{
+}
- rsvg_defs_set (ctx->defs, id, &mask->super.super);
+RsvgNode *
+rsvg_new_mask (void)
+{
+ RsvgMask *mask;
+
+ mask = g_new (RsvgMask, 1);
+ mask->maskunits = objectBoundingBox;
+ mask->contentunits = userSpaceOnUse;
+ mask->x = 0;
+ mask->y = 0;
+ mask->width = 1;
+ mask->height = 1;
+ mask->super.state = g_new(RsvgState, 1);
+ rsvg_state_init(mask->super.state);
+ mask->children = g_ptr_array_new ();
+ mask->super.type = RSVG_NODE_MASK;
+ mask->super.free = rsvg_mask_free;
+ mask->super.draw = rsvg_draw_nothing;
+ mask->super.add_child = rsvg_mask_add_child;
+ mask->super.set_atts = rsvg_mask_set_atts;
+ return &mask->super;
}
void
@@ -191,36 +200,21 @@ static void
rsvg_clip_path_free (RsvgNode * self)
{
RsvgClipPath *z = (RsvgClipPath *)self;
- g_ptr_array_free(z->super.children, TRUE);
- rsvg_state_finalize (z->super.super.state);
- g_free(z->super.super.state);
+ g_ptr_array_free(z->children, TRUE);
+ rsvg_state_finalize (z->super.state);
+ g_free(z->super.state);
g_free (z);
}
-static RsvgClipPath *
-rsvg_new_clip_path (void)
-{
- RsvgClipPath *clip_path;
-
- clip_path = g_new (RsvgClipPath, 1);
- clip_path->super.children = g_ptr_array_new ();
- clip_path->units = userSpaceOnUse;
- clip_path->super.super.state = g_new(RsvgState, 1);
- clip_path->super.super.type = RSVG_NODE_CLIP_PATH;
- clip_path->super.super.free = rsvg_clip_path_free;
- clip_path->super.super.add_child = rsvg_node_group_add_child;
- return clip_path;
-}
-
-void
-rsvg_start_clip_path (RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_clip_path_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
const char *id = NULL, *klazz = NULL, *value = NULL;
RsvgClipPath *clip_path;
double font_size;
font_size = rsvg_state_current_font_size (ctx);
- clip_path = rsvg_new_clip_path ();
+ clip_path = (RsvgClipPath *)self;
if (rsvg_property_bag_size (atts))
{
@@ -232,21 +226,43 @@ rsvg_start_clip_path (RsvgHandle *ctx, RsvgPropertyBag *atts)
clip_path->units = userSpaceOnUse;
}
if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+ {
+ id = value;
+ rsvg_defs_register_name(ctx->defs, id, &clip_path->super);
+ }
if ((value = rsvg_property_bag_lookup (atts, "class")))
klazz = value;
}
- rsvg_state_init (clip_path->super.super.state);
+ rsvg_state_init (clip_path->super.state);
- rsvg_parse_style_attrs (ctx, clip_path->super.super.state, "clipPath", klazz, id, atts);
+ rsvg_parse_style_attrs (ctx, clip_path->super.state, "clipPath", klazz, id, atts);
+}
- clip_path->super.super.parent = (RsvgNode *)ctx->currentnode;
+static void
+rsvg_clip_path_add_child (RsvgNode *overself, RsvgNode *child)
+{
+ RsvgClipPath *self = (RsvgClipPath *)overself;
+ if (self == NULL)
+ return;
+ g_ptr_array_add(self->children, child);
+}
- ctx->currentnode = &clip_path->super.super;
+RsvgNode *
+rsvg_new_clip_path (void)
+{
+ RsvgClipPath *clip_path;
- /* set up the defval stuff */
- rsvg_defs_set (ctx->defs, id, &clip_path->super.super);
+ clip_path = g_new (RsvgClipPath, 1);
+ clip_path->children = g_ptr_array_new ();
+ clip_path->units = userSpaceOnUse;
+ clip_path->super.state = g_new(RsvgState, 1);
+ clip_path->super.type = RSVG_NODE_CLIP_PATH;
+ clip_path->super.free = rsvg_clip_path_free;
+ clip_path->super.add_child = rsvg_clip_path_add_child;
+ clip_path->super.draw = rsvg_draw_nothing;
+ clip_path->super.set_atts = rsvg_clip_path_set_atts;
+ return &clip_path->super;
}
void
diff --git a/rsvg-mask.h b/rsvg-mask.h
index f8322520..7f148512 100644
--- a/rsvg-mask.h
+++ b/rsvg-mask.h
@@ -38,14 +38,15 @@ typedef RsvgCoordUnits RsvgMaskUnits;
typedef struct _RsvgMask RsvgMask;
struct _RsvgMask {
- RsvgNodeGroup super;
+ RsvgNode super;
+ GPtrArray *children;
double x, y, width, height;
RsvgMaskUnits maskunits;
RsvgMaskUnits contentunits;
};
-void
-rsvg_start_mask (RsvgHandle *ctx, RsvgPropertyBag *atts);
+RsvgNode *
+rsvg_new_mask (void);
void
rsvg_end_mask (RsvgHandle *ctx);
@@ -56,12 +57,13 @@ rsvg_mask_parse (const RsvgDefs * defs, const char *str);
typedef struct _RsvgClipPath RsvgClipPath;
struct _RsvgClipPath {
- RsvgNodeGroup super;
+ RsvgNode super;
RsvgCoordUnits units;
+ GPtrArray *children;
};
-void
-rsvg_start_clip_path (RsvgHandle *ctx, RsvgPropertyBag *atts);
+RsvgNode *
+rsvg_new_clip_path (void);
void
rsvg_end_clip_path (RsvgHandle *ctx);
@@ -69,6 +71,8 @@ rsvg_end_clip_path (RsvgHandle *ctx);
RsvgNode *
rsvg_clip_path_parse (const RsvgDefs * defs, const char *str);
+void
+rsvg_node_mask_draw (RsvgMask *group, RsvgDrawingCtx *ctx, int dominate);
G_END_DECLS
diff --git a/rsvg-private.h b/rsvg-private.h
index 3a45477b..598c3c8e 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -202,6 +202,7 @@ struct _RsvgNode {
void (*add_child) (RsvgNode *self, RsvgNode *child);
void (*free) (RsvgNode *self);
void (*draw) (RsvgNode * self, RsvgDrawingCtx *ctx, int dominate);
+ void (*set_atts) (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag*);
};
typedef void (*RsvgPropertyBagEnumFunc) (const char * key,
@@ -303,6 +304,9 @@ _rsvg_affine_rectilinear (const double src[6]);
int
_rsvg_affine_equal (double matrix1[6], double matrix2[6]);
+void
+rsvg_node_set_atts(RsvgNode * node, RsvgHandle * ctx, RsvgPropertyBag * atts);
+
G_END_DECLS
#endif
diff --git a/rsvg-structure.c b/rsvg-structure.c
index ecaa48a6..be02d72f 100644
--- a/rsvg-structure.c
+++ b/rsvg-structure.c
@@ -46,24 +46,23 @@ rsvg_node_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
self->draw(self, ctx, dominate);
}
-void
-rsvg_start_g (RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_node_group_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
- RsvgState state;
const char * klazz = NULL, * id = NULL, *value;
- rsvg_state_init(&state);
if (rsvg_property_bag_size (atts))
{
if ((value = rsvg_property_bag_lookup (atts, "class")))
klazz = value;
if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+ {
+ id = value;
+ rsvg_defs_register_name (ctx->defs, value, self);
+ }
- rsvg_parse_style_attrs (ctx, &state, "g", klazz, id, atts);
+ rsvg_parse_style_attrs (ctx, self->state, "g", klazz, id, atts);
}
-
- rsvg_push_def_group (ctx, id, &state);
}
void
@@ -116,32 +115,19 @@ rsvg_node_group_add_child (RsvgNode *overself, RsvgNode *child)
g_ptr_array_add(self->children, child);
}
-RsvgNode *
-rsvg_push_def_group (RsvgHandle *ctx, const char * id,
- RsvgState *state)
+RsvgNode *
+rsvg_new_group (void)
{
RsvgNodeGroup *group;
-
group = g_new (RsvgNodeGroup, 1);
group->children = g_ptr_array_new();
group->super.state = g_new(RsvgState, 1);
- *group->super.state = *state;
-
+ rsvg_state_init(group->super.state);
group->super.type = RSVG_NODE_PATH;
group->super.free = rsvg_node_group_free;
group->super.add_child = rsvg_node_group_add_child;
group->super.draw = rsvg_node_group_draw;
-
- rsvg_defs_set (ctx->defs, id, &group->super);
-
- group->super.parent = (RsvgNode *)ctx->currentnode;
-
- ctx->currentnode = &group->super;
-
- if (group->super.parent != NULL)
- rsvg_node_group_pack(group->super.parent,
- &group->super);
-
+ group->super.set_atts = rsvg_node_group_set_atts;
return &group->super;
}
@@ -173,13 +159,8 @@ rsvg_push_part_def_group (RsvgHandle *ctx, const char * id,
void
rsvg_pop_def_group (RsvgHandle *ctx)
{
- RsvgNodeGroup * group;
-
- group = (RsvgNodeGroup *)ctx->currentnode;
- if (group == NULL)
- return;
- ctx->currentnode = group->super.parent;
-
+ if (ctx->currentnode != NULL)
+ ctx->currentnode = ctx->currentnode->parent;
}
void
@@ -253,6 +234,9 @@ rsvg_node_use_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
RsvgNodeUse *use = (RsvgNodeUse*)self;
RsvgNode * child;
+ if (use->w <= 0 || use->h <= 0)
+ return;
+
rsvg_state_reinherit_top(ctx, self->state, dominate);
child = rsvg_node_use_resolve(use, ctx, rsvg_state_current(ctx)->affine);
@@ -288,7 +272,6 @@ rsvg_node_svg_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
RsvgNodeSvg * sself;
RsvgState *state;
gdouble affine[6];
- RsvgNodeGroup *group = (RsvgNodeGroup*)self;
guint i;
sself = (RsvgNodeSvg *)self;
@@ -324,11 +307,11 @@ rsvg_node_svg_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
state->affine);
}
- for (i = 0; i < group->children->len; i++)
+ for (i = 0; i < sself->children->len; i++)
{
rsvg_state_push(ctx);
- rsvg_node_draw (g_ptr_array_index(group->children, i),
+ rsvg_node_draw (g_ptr_array_index(sself->children, i),
ctx, 0);
rsvg_state_pop(ctx);
@@ -340,95 +323,88 @@ rsvg_node_svg_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
static void
rsvg_node_svg_free (RsvgNode *self)
{
- RsvgNodeGroup *z = (RsvgNodeGroup *)self;
- rsvg_state_finalize (z->super.state);
- g_free (z->super.state);
+ RsvgNodeSvg *z = (RsvgNodeSvg *)self;
+ rsvg_state_finalize (self->state);
+ g_free (self->state);
g_ptr_array_free(z->children, TRUE);
g_free (z);
}
-void
-rsvg_start_svg (RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_node_svg_add_child (RsvgNode *overself, RsvgNode *child)
+{
+ RsvgNodeSvg *self = (RsvgNodeSvg *)overself;
+ g_ptr_array_add(self->children, child);
+}
+
+static void
+rsvg_node_svg_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
- int width = -1, height = -1, x = 0, y = 0;
const char * id, *value;
- double vbox_x = 0, vbox_y = 0, vbox_w = 0, vbox_h = 0;
- gboolean has_vbox = FALSE, overflow = 0;
- RsvgNodeSvg * svg;
- RsvgNodeGroup * group;
- RsvgState state;
+ RsvgNodeSvg * svg = (RsvgNodeSvg *)self;
id = NULL;
- rsvg_state_init(&state);
if (rsvg_property_bag_size (atts))
{
if ((value = rsvg_property_bag_lookup (atts, "viewBox")))
{
- has_vbox = rsvg_css_parse_vbox (value, &vbox_x, &vbox_y,
- &vbox_w, &vbox_h);
- /*we need to set width and height so we can use percentages for the size*/
- ctx->width = vbox_w;
- ctx->height = vbox_h;
+ svg->has_vbox = rsvg_css_parse_vbox (value,
+ &svg->vbx,
+ &svg->vby,
+ &svg->vbw,
+ &svg->vbh);
+ if (svg->has_vbox)
+ {
+ ctx->width = svg->vbw;
+ ctx->height = svg->vbh;
+ }
}
if ((value = rsvg_property_bag_lookup (atts, "width")))
- width = rsvg_css_parse_normalized_length (value, ctx->dpi_x, ctx->width, 1);
+ {
+ svg->w = rsvg_css_parse_normalized_length (value, ctx->dpi_x, ctx->width, 1);
+ if (!svg->has_vbox)
+ ctx->width = svg->w;
+ }
if ((value = rsvg_property_bag_lookup (atts, "height")))
- height = rsvg_css_parse_normalized_length (value, ctx->dpi_y, ctx->height, 1);
+ {
+ svg->h = rsvg_css_parse_normalized_length (value, ctx->dpi_y, ctx->height, 1);
+ if (!svg->has_vbox)
+ ctx->height = svg->h;
+ }
if ((value = rsvg_property_bag_lookup (atts, "x")))
- x = rsvg_css_parse_normalized_length (value, ctx->dpi_x, ctx->width, 1);
+ svg->x = rsvg_css_parse_normalized_length (value, ctx->dpi_x, ctx->width, 1);
if ((value = rsvg_property_bag_lookup (atts, "y")))
- y = rsvg_css_parse_normalized_length (value, ctx->dpi_y, ctx->height, 1);
+ svg->y = rsvg_css_parse_normalized_length (value, ctx->dpi_y, ctx->height, 1);
if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+ {
+ id = value;
+ rsvg_defs_register_name (ctx->defs, value, &svg->super);
+ }
if ((value = rsvg_property_bag_lookup (atts, "overflow")))
- overflow = rsvg_css_parse_overflow(value);
+ svg->overflow = rsvg_css_parse_overflow(value);
}
+}
+RsvgNode *
+rsvg_new_svg (void)
+{
+ RsvgNodeSvg * svg;
svg = g_new (RsvgNodeSvg, 1);
- group = &svg->super;
- svg->has_vbox = has_vbox;
+ svg->has_vbox = FALSE;
svg->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID;
-
- svg->x = x; svg->y = y; svg->w = width; svg->h = height;
- svg->vbx = vbox_x; svg->vby = vbox_y; svg->vbw = vbox_w; svg->vbh = vbox_h;
- if (ctx->nest_level)
- svg->overflow = overflow;
- else
- svg->overflow = 1;
-
- if (has_vbox)
- {
- ctx->width = vbox_w;
- ctx->height = vbox_h;
- }
- else
- {
- ctx->width = width;
- ctx->height = height;
- }
-
- group->children = g_ptr_array_new();
- group->super.state = g_new(RsvgState, 1);
- *group->super.state = state;
-
- group->super.type = RSVG_NODE_PATH;
- group->super.free = rsvg_node_svg_free;
- group->super.draw = rsvg_node_svg_draw;
- group->super.add_child = rsvg_node_group_add_child;
-
- rsvg_defs_set (ctx->defs, id, &group->super);
-
- group->super.parent = (RsvgNode *)ctx->currentnode;
-
- ctx->currentnode = &group->super;
-
- if (group->super.parent != NULL)
- rsvg_node_group_pack(group->super.parent, &group->super);
-
- if (!ctx->nest_level)
- ctx->treebase = group;
- ctx->nest_level++;
+ svg->x = 0; svg->y = 0; svg->w = -1; svg->h = -1;
+ svg->vbx = 0; svg->vby = 0; svg->vbw = 0; svg->vbh = 0;
+ svg->children = g_ptr_array_new();
+ svg->super.state = g_new(RsvgState, 1);
+ rsvg_state_init(svg->super.state);
+ svg->super.type = RSVG_NODE_PATH;
+ svg->super.free = rsvg_node_svg_free;
+ svg->super.draw = rsvg_node_svg_draw;
+ svg->super.add_child = rsvg_node_svg_add_child;
+ svg->super.set_atts = rsvg_node_svg_set_atts;
+ svg->overflow = FALSE;
+ return &svg->super;
}
void
@@ -438,73 +414,70 @@ rsvg_end_svg(RsvgHandle *ctx)
rsvg_pop_def_group (ctx);
}
-void
-rsvg_start_use (RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_node_use_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
- const char * klazz = NULL, *id = NULL, *xlink_href = NULL, *value;
- double x = 0, y = 0, width = 0, height = 0, font_size;
+ const char *value = NULL, *klazz = NULL, *id = NULL;
+ double font_size;
gboolean got_width = FALSE, got_height = FALSE;
- RsvgState state;
- rsvg_state_init(&state);
font_size = rsvg_state_current_font_size(ctx);
+ RsvgNodeUse * use;
+ use = (RsvgNodeUse *)self;
if (rsvg_property_bag_size(atts))
{
if ((value = rsvg_property_bag_lookup (atts, "x")))
- x = rsvg_css_parse_normalized_length (value, ctx->dpi_x, (gdouble)ctx->width, font_size);
+ use->x = rsvg_css_parse_normalized_length (value, ctx->dpi_x, (gdouble)ctx->width, font_size);
if ((value = rsvg_property_bag_lookup (atts, "y")))
- y = rsvg_css_parse_normalized_length (value, ctx->dpi_y, (gdouble)ctx->height, font_size);
+ use->y = rsvg_css_parse_normalized_length (value, ctx->dpi_y, (gdouble)ctx->height, font_size);
if ((value = rsvg_property_bag_lookup (atts, "width"))) {
- width = rsvg_css_parse_normalized_length (value, ctx->dpi_x, (gdouble)ctx->height, font_size);
+ use->w = rsvg_css_parse_normalized_length (value, ctx->dpi_x, (gdouble)ctx->height, font_size);
got_width = TRUE;
}
if ((value = rsvg_property_bag_lookup (atts, "height"))) {
- height = rsvg_css_parse_normalized_length (value, ctx->dpi_y, (gdouble)ctx->height, font_size);
+ use->h = rsvg_css_parse_normalized_length (value, ctx->dpi_y, (gdouble)ctx->height, font_size);
got_height = TRUE;
}
if ((value = rsvg_property_bag_lookup (atts, "class")))
klazz = value;
if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+ {
+ id = value;
+ rsvg_defs_register_name (ctx->defs, value, &use->super);
+ }
if ((value = rsvg_property_bag_lookup (atts, "xlink:href")))
- xlink_href = value;
+ rsvg_defs_add_resolver (ctx->defs, &use->link, value);
+ rsvg_parse_style_attrs (ctx, self->state, "use", klazz, id, atts);
}
- if (!xlink_href)
- return;
-
- rsvg_parse_style_attrs (ctx, &state, "use", klazz, id, atts);
-
- /* < 0 is an error, 0 disables rendering. TODO: handle positive values correctly */
- if (got_width || got_height)
- if (width <= 0. || height <= 0.)
- return;
+
+}
+RsvgNode *
+rsvg_new_use ()
+{
RsvgNodeUse * use;
use = g_new (RsvgNodeUse, 1);
use->super.state = g_new(RsvgState, 1);
- *use->super.state = state;
+ rsvg_state_init(use->super.state);
use->super.type = RSVG_NODE_PATH;
use->super.free = rsvg_node_use_free;
use->super.draw = rsvg_node_use_draw;
- use->x = x;
- use->y = y;
- use->w = width;
- use->h = height;
+ use->super.set_atts = rsvg_node_use_set_atts;
+ use->x = 0;
+ use->y = 0;
+ use->w = 0;
+ use->h = 0;
use->link = NULL;
- rsvg_defs_add_resolver (ctx->defs, &use->link, xlink_href);
- rsvg_defs_set (ctx->defs, id, &use->super);
-
- use->super.parent = (RsvgNode *)ctx->currentnode;
- if (use->super.parent != NULL)
- rsvg_node_group_pack(use->super.parent, &use->super);
+ return (RsvgNode *)use;
}
+
static void
rsvg_node_symbol_free (RsvgNode *self)
{
- RsvgNodeGroup *z = (RsvgNodeGroup *)self;
- rsvg_state_finalize (z->super.state);
- g_free(z->super.state);
+ RsvgNodeSymbol *z = (RsvgNodeSymbol *)self;
+ rsvg_state_finalize (self->state);
+ g_free(self->state);
g_ptr_array_free(z->children, TRUE);
g_free (z);
}
@@ -515,7 +488,6 @@ rsvg_node_symbol_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
{
RsvgNodeSymbol * sself;
RsvgState *state;
- RsvgNodeGroup *group = (RsvgNodeGroup*)self;
guint i;
sself = (RsvgNodeSymbol *)self;
@@ -529,11 +501,11 @@ rsvg_node_symbol_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
rsvg_add_clipping_rect(ctx, sself->x, sself->y, sself->width, sself->height);
}
- for (i = 0; i < group->children->len; i++)
+ for (i = 0; i < sself->children->len; i++)
{
rsvg_state_push(ctx);
- rsvg_node_draw (g_ptr_array_index(group->children, i),
+ rsvg_node_draw (g_ptr_array_index(sself->children, i),
ctx, 0);
rsvg_state_pop(ctx);
@@ -543,20 +515,12 @@ rsvg_node_symbol_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
}
-void
-rsvg_start_symbol(RsvgHandle *ctx, RsvgPropertyBag *atts)
+static void
+rsvg_node_symbol_set_atts(RsvgNode *self, RsvgHandle *ctx, RsvgPropertyBag *atts)
{
- RsvgNodeSymbol *symbol;
- RsvgNodeGroup *group;
- RsvgState state;
- const char * klazz = NULL, *id = NULL, *value;
+ RsvgNodeSymbol *symbol = (RsvgNodeSymbol *)self;
- rsvg_state_init(&state);
- symbol = g_new (RsvgNodeSymbol, 1);
- group = &symbol->super;
- symbol->has_vbox = 0;
- symbol->overflow = 0;
- symbol->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID;
+ const char * klazz = NULL, *id = NULL, *value;
if (rsvg_property_bag_size(atts))
{
@@ -583,42 +547,55 @@ rsvg_start_symbol(RsvgHandle *ctx, RsvgPropertyBag *atts)
symbol->overflow = rsvg_css_parse_overflow(value);
}
- rsvg_parse_style_attrs (ctx, &state, "symbol", klazz, id, atts);
- group->children = g_ptr_array_new();
- group->super.state = g_new(RsvgState, 1);
- *group->super.state = state;
- group->super.type = RSVG_NODE_SYMBOL;
- group->super.free = rsvg_node_symbol_free;
- group->super.draw = rsvg_node_symbol_draw;
- group->super.add_child = rsvg_node_group_add_child;
-
- rsvg_defs_set (ctx->defs, id, &group->super);
-
- group->super.parent = (RsvgNode *)ctx->currentnode;
+ rsvg_parse_style_attrs (ctx, self->state, "symbol", klazz, id, atts);
+}
- ctx->currentnode = &group->super;
+static void
+rsvg_node_symbol_add_child (RsvgNode *overself, RsvgNode *child)
+{
+ RsvgNodeSymbol *self = (RsvgNodeSymbol *)overself;
+ g_ptr_array_add(self->children, child);
}
-void
-rsvg_start_defs (RsvgHandle *ctx, RsvgPropertyBag *atts)
+RsvgNode *
+rsvg_new_symbol(void)
{
- RsvgState state;
- const char * klazz = NULL, * id = NULL, *value;
- rsvg_state_init(&state);
+ RsvgNodeSymbol * symbol;
+ symbol = g_new (RsvgNodeSymbol, 1);
+ symbol->has_vbox = 0;
+ symbol->overflow = 0;
+ symbol->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID;
+ symbol->children = g_ptr_array_new();
+ symbol->super.state = g_new(RsvgState, 1);
+ rsvg_state_init(symbol->super.state);
+ symbol->super.type = RSVG_NODE_SYMBOL;
+ symbol->super.free = rsvg_node_symbol_free;
+ symbol->super.draw = rsvg_node_symbol_draw;
+ symbol->super.add_child = rsvg_node_symbol_add_child;
+ symbol->super.set_atts = rsvg_node_symbol_set_atts;
+ return &symbol->super;
+}
- if (rsvg_property_bag_size (atts))
- {
- if ((value = rsvg_property_bag_lookup (atts, "class")))
- klazz = value;
- if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
+static void
+_rsvg_node_defs_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
+ int dominate)
+{
+}
- rsvg_parse_style_attrs (ctx, &state, "defs", klazz, id, atts);
- }
-
- /*I don't know if I am proud or discusted by this hack. It seems to
- have the same effect as the spec but not be in its spirit.*/
- rsvg_push_part_def_group (ctx, id, &state);
+RsvgNode *
+rsvg_new_defs ()
+{
+ RsvgNodeGroup *group;
+ group = g_new (RsvgNodeGroup, 1);
+ group->children = g_ptr_array_new();
+ group->super.state = g_new(RsvgState, 1);
+ rsvg_state_init(group->super.state);
+ group->super.type = RSVG_NODE_PATH;
+ group->super.free = rsvg_node_group_free;
+ group->super.add_child = rsvg_node_group_add_child;
+ group->super.draw = _rsvg_node_defs_draw;
+ group->super.set_atts = rsvg_node_group_set_atts;
+ return &group->super;
}
static void
@@ -649,27 +626,20 @@ _rsvg_node_switch_draw (RsvgNode * self, RsvgDrawingCtx *ctx,
rsvg_pop_discrete_layer (ctx);
}
-void
-rsvg_start_switch (RsvgHandle *ctx, RsvgPropertyBag *atts)
+RsvgNode *
+rsvg_new_switch (void)
{
- RsvgState state;
- RsvgNode * group;
- const char * klazz = NULL, * id = NULL, *value;
-
- rsvg_state_init(&state);
-
- if (rsvg_property_bag_size (atts))
- {
- if ((value = rsvg_property_bag_lookup (atts, "class")))
- klazz = value;
- if ((value = rsvg_property_bag_lookup (atts, "id")))
- id = value;
-
- rsvg_parse_style_attrs (ctx, &state, "switch", klazz, id, atts);
- }
-
- group = rsvg_push_def_group (ctx, id, &state);
- group->draw = _rsvg_node_switch_draw;
+ RsvgNodeGroup *group;
+ group = g_new (RsvgNodeGroup, 1);
+ group->children = g_ptr_array_new();
+ group->super.state = g_new(RsvgState, 1);
+ rsvg_state_init(group->super.state);
+ group->super.type = RSVG_NODE_PATH;
+ group->super.free = rsvg_node_group_free;
+ group->super.add_child = rsvg_node_group_add_child;
+ group->super.draw = _rsvg_node_switch_draw;
+ group->super.set_atts = rsvg_node_group_set_atts;
+ return &group->super;
}
void
diff --git a/rsvg-structure.h b/rsvg-structure.h
index 19c8a557..dec33c24 100644
--- a/rsvg-structure.h
+++ b/rsvg-structure.h
@@ -35,12 +35,12 @@
G_BEGIN_DECLS
-void rsvg_start_use (RsvgHandle *ctx, RsvgPropertyBag *atts);
-void rsvg_start_symbol (RsvgHandle *ctx, RsvgPropertyBag *atts);
-void rsvg_start_svg (RsvgHandle *ctx, RsvgPropertyBag *atts);
-void rsvg_start_defs (RsvgHandle *ctx, RsvgPropertyBag *atts);
-void rsvg_start_g (RsvgHandle *ctx, RsvgPropertyBag *atts);
-void rsvg_start_switch (RsvgHandle *ctx, RsvgPropertyBag *atts);
+RsvgNode * rsvg_new_use (void);
+RsvgNode * rsvg_new_symbol (void);
+RsvgNode * rsvg_new_svg (void);
+RsvgNode * rsvg_new_defs (void);
+RsvgNode * rsvg_new_group (void);
+RsvgNode * rsvg_new_switch (void);
void rsvg_end_g (RsvgHandle *ctx);
void rsvg_end_svg (RsvgHandle *ctx);
void rsvg_end_switch (RsvgHandle *ctx);
@@ -56,7 +56,8 @@ struct _RsvgNodeGroup {
};
struct _RsvgNodeSymbol {
- RsvgNodeGroup super;
+ RsvgNode super;
+ GPtrArray *children;
gint preserve_aspect_ratio;
gboolean overflow, has_vbox;
double x, y, width, height;
@@ -69,17 +70,16 @@ struct _RsvgNodeUse {
};
struct _RsvgNodeSvg {
- RsvgNodeGroup super;
+ RsvgNode super;
gint preserve_aspect_ratio;
gdouble x, y, w, h;
gdouble vbx, vby, vbw, vbh;
gboolean overflow, has_vbox;
GdkPixbuf *img;
+ GPtrArray *children;
};
RsvgNode *
-rsvg_push_def_group (RsvgHandle *ctx, const char * id, RsvgState *);
-RsvgNode *
rsvg_push_part_def_group (RsvgHandle *ctx, const char * id, RsvgState *state);
void rsvg_pop_def_group (RsvgHandle *ctx);
void rsvg_node_group_pack (RsvgNode *self, RsvgNode *child);
diff --git a/rsvg.c b/rsvg.c
index 7d56d056..3975ad30 100644
--- a/rsvg.c
+++ b/rsvg.c
@@ -166,60 +166,65 @@ rsvg_filter_handler_start (RsvgHandle *ctx, const xmlChar *name,
{
RsvgNode * newnode = NULL;
if (!strcmp ((char *)name, "filter"))
- newnode = rsvg_start_filter(ctx, atts);
+ newnode = rsvg_new_filter();
else if (!strcmp ((char *)name, "feBlend"))
- newnode = rsvg_start_filter_primitive_blend (ctx, atts);
+ newnode = rsvg_new_filter_primitive_blend ();
else if (!strcmp ((char *)name, "feColorMatrix"))
- newnode = rsvg_start_filter_primitive_colour_matrix(ctx, atts);
+ newnode = rsvg_new_filter_primitive_colour_matrix();
else if (!strcmp ((char *)name, "feComponentTransfer"))
- newnode = rsvg_start_filter_primitive_component_transfer(ctx, atts);
+ newnode = rsvg_new_filter_primitive_component_transfer();
else if (!strcmp ((char *)name, "feComposite"))
- newnode = rsvg_start_filter_primitive_composite(ctx, atts);
+ newnode = rsvg_new_filter_primitive_composite();
else if (!strcmp ((char *)name, "feConvolveMatrix"))
- newnode = rsvg_start_filter_primitive_convolve_matrix (ctx, atts);
+ newnode = rsvg_new_filter_primitive_convolve_matrix ();
else if (!strcmp ((char *)name, "feDiffuseLighting"))
- newnode = rsvg_start_filter_primitive_diffuse_lighting(ctx, atts);
+ newnode = rsvg_new_filter_primitive_diffuse_lighting();
else if (!strcmp ((char *)name, "feDisplacementMap"))
- newnode = rsvg_start_filter_primitive_displacement_map(ctx, atts);
+ newnode = rsvg_new_filter_primitive_displacement_map();
else if (!strcmp ((char *)name, "feFlood"))
- newnode = rsvg_start_filter_primitive_flood(ctx, atts);
+ newnode = rsvg_new_filter_primitive_flood();
else if (!strcmp ((char *)name, "feGaussianBlur"))
- newnode = rsvg_start_filter_primitive_gaussian_blur (ctx, atts);
+ newnode = rsvg_new_filter_primitive_gaussian_blur ();
else if (!strcmp ((char *)name, "feImage"))
- newnode = rsvg_start_filter_primitive_image (ctx, atts);
+ newnode = rsvg_new_filter_primitive_image ();
else if (!strcmp ((char *)name, "feMerge"))
- newnode = rsvg_start_filter_primitive_merge(ctx, atts);
+ newnode = rsvg_new_filter_primitive_merge();
else if (!strcmp ((char *)name, "feMorphology"))
- newnode = rsvg_start_filter_primitive_erode(ctx, atts);
+ newnode = rsvg_new_filter_primitive_erode();
else if (!strcmp ((char *)name, "feOffset"))
- newnode = rsvg_start_filter_primitive_offset(ctx, atts);
+ newnode = rsvg_new_filter_primitive_offset();
else if (!strcmp ((char *)name, "feSpecularLighting"))
- newnode = rsvg_start_filter_primitive_specular_lighting(ctx, atts);
+ newnode = rsvg_new_filter_primitive_specular_lighting();
else if (!strcmp ((char *)name, "feTile"))
- newnode = rsvg_start_filter_primitive_tile(ctx, atts);
+ newnode = rsvg_new_filter_primitive_tile();
else if (!strcmp ((char *)name, "feTurbulence"))
- newnode = rsvg_start_filter_primitive_turbulence(ctx, atts);
- else if (!strcmp ((char *)name, "feDistantLight"))
- rsvg_start_filter_primitive_light_source(ctx, atts, 'd');
- else if (!strcmp ((char *)name, "feSpotLight"))
- rsvg_start_filter_primitive_light_source(ctx, atts, 's');
- else if (!strcmp ((char *)name, "fePointLight"))
- rsvg_start_filter_primitive_light_source(ctx, atts, 'p');
- else if (!strcmp ((char *)name, "feMergeNode"))
- rsvg_start_filter_primitive_merge_node(ctx, atts);
- else if (!strcmp ((char *)name, "feFuncR"))
- rsvg_start_filter_primitive_component_transfer_function(ctx, atts, 'r');
- else if (!strcmp ((char *)name, "feFuncG"))
- rsvg_start_filter_primitive_component_transfer_function(ctx, atts, 'g');
- else if (!strcmp ((char *)name, "feFuncB"))
- rsvg_start_filter_primitive_component_transfer_function(ctx, atts, 'b');
- else if (!strcmp ((char *)name, "feFuncA"))
- rsvg_start_filter_primitive_component_transfer_function(ctx, atts, 'a');
+ newnode = rsvg_new_filter_primitive_turbulence();
+ else if (!strcmp ((char *)name, "g"))
+ newnode = rsvg_new_group ();
+ else if (!strcmp ((char *)name, "a")) /*treat anchors as groups for now*/
+ newnode = rsvg_new_group ();
+ else if (!strcmp ((char *)name, "switch"))
+ newnode = rsvg_new_switch ();
+ else if (!strcmp ((char *)name, "defs"))
+ newnode = rsvg_new_defs ();
+ else if (!strcmp ((char *)name, "use"))
+ newnode = rsvg_new_use ();
+ else if (!strcmp ((char *)name, "symbol"))
+ newnode = rsvg_new_symbol ();
+ else if (!strcmp ((char *)name, "svg"))
+ newnode = rsvg_new_svg ();
+ else if (!strcmp ((char *)name, "mask"))
+ newnode = rsvg_new_mask();
+ else if (!strcmp ((char *)name, "clipPath"))
+ newnode = rsvg_new_clip_path();
if (newnode)
{
+ rsvg_node_set_atts(newnode, ctx, atts);
rsvg_defs_register_memory(ctx->defs, newnode);
if (ctx->currentnode)
rsvg_node_group_pack(ctx->currentnode, newnode);
+ else
+ ctx->treebase = newnode;
ctx->currentnode = newnode;
}
}
@@ -488,17 +493,7 @@ rsvg_start_element (void *data, const xmlChar *name,
}
else
{
- if (!strcmp ((char *)name, "svg"))
- rsvg_start_svg (ctx, bag);
- else if (!strcmp ((char *)name, "g"))
- rsvg_start_g (ctx, bag);
- else if (!strcmp ((char *)name, "a")) /*treat anchors as groups for now*/
- rsvg_start_g (ctx, bag);
- else if (!strcmp ((char *)name, "symbol"))
- rsvg_start_symbol (ctx, bag);
- else if (!strcmp ((char *)name, "defs"))
- rsvg_start_defs(ctx, bag);
- else if (!strcmp ((char *)name, "path"))
+ if (!strcmp ((char *)name, "path"))
rsvg_start_path (ctx, bag);
else if (!strcmp ((char *)name, "line"))
rsvg_start_line (ctx, bag);
@@ -512,8 +507,6 @@ rsvg_start_element (void *data, const xmlChar *name,
rsvg_start_polygon (ctx, bag);
else if (!strcmp ((char *)name, "polyline"))
rsvg_start_polyline (ctx, bag);
- else if (!strcmp ((char *)name, "use"))
- rsvg_start_use (ctx, bag);
else if (!strcmp ((char *)name, "text"))
rsvg_start_text (ctx, bag);
else if (!strcmp ((char *)name, "image"))
@@ -526,14 +519,8 @@ rsvg_start_element (void *data, const xmlChar *name,
rsvg_start_desc (ctx, bag);
else if (!strcmp ((char *)name, "metadata"))
rsvg_start_metadata (ctx, bag);
- else if (!strcmp ((char *)name, "mask"))
- rsvg_start_mask(ctx, bag);
- else if (!strcmp ((char *)name, "clipPath"))
- rsvg_start_clip_path(ctx, bag);
else if (!strcmp ((char *)name, "marker"))
rsvg_start_marker (ctx, bag);
- else if (!strcmp ((char *)name, "switch"))
- rsvg_start_switch (ctx, bag);
/* see conicalGradient discussion above */
else if (!strcmp ((char *)name, "linearGradient"))
rsvg_start_linear_gradient (ctx, bag);
@@ -543,7 +530,22 @@ rsvg_start_element (void *data, const xmlChar *name,
rsvg_start_radial_gradient (ctx, bag, "conicalGradient");
else if (!strcmp ((char *)name, "pattern"))
rsvg_start_pattern (ctx, bag);
-
+ else if (!strcmp ((char *)name, "feDistantLight"))
+ rsvg_start_filter_primitive_light_source(ctx, bag, 'd');
+ else if (!strcmp ((char *)name, "feSpotLight"))
+ rsvg_start_filter_primitive_light_source(ctx, bag, 's');
+ else if (!strcmp ((char *)name, "fePointLight"))
+ rsvg_start_filter_primitive_light_source(ctx, bag, 'p');
+ else if (!strcmp ((char *)name, "feMergeNode"))
+ rsvg_start_filter_primitive_merge_node(ctx, bag);
+ else if (!strcmp ((char *)name, "feFuncR"))
+ rsvg_start_filter_primitive_component_transfer_function(ctx, bag, 'r');
+ else if (!strcmp ((char *)name, "feFuncG"))
+ rsvg_start_filter_primitive_component_transfer_function(ctx, bag, 'g');
+ else if (!strcmp ((char *)name, "feFuncB"))
+ rsvg_start_filter_primitive_component_transfer_function(ctx, bag, 'b');
+ else if (!strcmp ((char *)name, "feFuncA"))
+ rsvg_start_filter_primitive_component_transfer_function(ctx, bag, 'a');
rsvg_filter_handler_start (ctx, name, bag);
}
@@ -584,6 +586,8 @@ rsvg_end_element (void *data, const xmlChar *name)
rsvg_end_svg (ctx);
else if (!strcmp ((char *)name, "symbol"))
rsvg_end_g (ctx);
+ else if (!strcmp ((char *)name, "use"))
+ rsvg_end_g (ctx);
else if (!strcmp ((char *)name, "filter"))
rsvg_end_filter (ctx);
else if (!strcmp ((char *)name, "defs"))
@@ -1325,6 +1329,12 @@ rsvg_term (void)
xmlCleanupParser ();
}
+void
+rsvg_node_set_atts(RsvgNode * node, RsvgHandle * ctx, RsvgPropertyBag * atts)
+{
+ node->set_atts(node, ctx, atts);
+}
+
void
rsvg_pop_discrete_layer(RsvgDrawingCtx *ctx)
{