diff options
author | Caleb Michael Moore <cmoore@src.gnome.org> | 2005-05-15 17:53:10 +0000 |
---|---|---|
committer | Caleb Michael Moore <cmoore@src.gnome.org> | 2005-05-15 17:53:10 +0000 |
commit | cf2e610b3469e5a29194225accd5c06c225b2047 (patch) | |
tree | 6e414c89c6edd3d4e9ace03066013643cd437149 | |
parent | e3a24a0fb92e39db17c71591e1973614c41d01ff (diff) | |
download | librsvg-cf2e610b3469e5a29194225accd5c06c225b2047.tar.gz |
more DOM stuff
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | rsvg-art-mask.c | 9 | ||||
-rw-r--r-- | rsvg-filter.c | 529 | ||||
-rw-r--r-- | rsvg-filter.h | 37 | ||||
-rw-r--r-- | rsvg-mask.c | 158 | ||||
-rw-r--r-- | rsvg-mask.h | 16 | ||||
-rw-r--r-- | rsvg-private.h | 4 | ||||
-rw-r--r-- | rsvg-structure.c | 370 | ||||
-rw-r--r-- | rsvg-structure.h | 20 | ||||
-rw-r--r-- | rsvg.c | 116 |
10 files changed, 673 insertions, 590 deletions
@@ -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); @@ -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) { |