Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:Test
librsvg
librsvg-CVE-2011-3146.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File librsvg-CVE-2011-3146.patch of Package librsvg
--- ./rsvg-cairo-draw.c.orig 2011-10-07 08:34:51.826271561 +0200 +++ ./rsvg-cairo-draw.c 2011-10-07 08:35:38.651295733 +0200 @@ -144,7 +144,7 @@ for (i = 0; i < stops->len; i++) { node = (RsvgNode *) g_ptr_array_index (stops, i); - if (strcmp (node->type->str, "stop")) + if (RSVG_NODE_TYPE (node) != RSVG_NODE_TYPE_STOP) continue; stop = (RsvgGradientStop *) node; rgba = stop->rgba; --- ./rsvg-private.h.orig 2011-10-07 08:34:51.838271565 +0200 +++ ./rsvg-private.h 2011-10-07 10:30:19.641292127 +0200 @@ -247,6 +247,60 @@ void _rsvg_size_callback (int *width, int *height, gpointer data); +typedef enum { + RSVG_NODE_TYPE_INVALID = 0, + + RSVG_NODE_TYPE_CHARS, + RSVG_NODE_TYPE_CIRCLE, + RSVG_NODE_TYPE_CLIP_PATH, + RSVG_NODE_TYPE_COMPONENT_TRANFER_FUNCTION, + RSVG_NODE_TYPE_DEFS, + RSVG_NODE_TYPE_ELLIPSE, + RSVG_NODE_TYPE_FILTER, + RSVG_NODE_TYPE_GROUP, + RSVG_NODE_TYPE_IMAGE, + RSVG_NODE_TYPE_LIGHT_SOURCE, + RSVG_NODE_TYPE_LINE, + RSVG_NODE_TYPE_LINEAR_GRADIENT, + RSVG_NODE_TYPE_MARKER, + RSVG_NODE_TYPE_MASK, + RSVG_NODE_TYPE_PATH, + RSVG_NODE_TYPE_PATTERN, + RSVG_NODE_TYPE_POLYGON, + RSVG_NODE_TYPE_POLYLINE, + RSVG_NODE_TYPE_RADIAL_GRADIENT, + RSVG_NODE_TYPE_RECT, + RSVG_NODE_TYPE_STOP, + RSVG_NODE_TYPE_SVG, + RSVG_NODE_TYPE_SWITCH, + RSVG_NODE_TYPE_SYMBOL, + RSVG_NODE_TYPE_TEXT, + RSVG_NODE_TYPE_TREF, + RSVG_NODE_TYPE_TSPAN, + RSVG_NODE_TYPE_USE, + + /* Filter primitives */ + RSVG_NODE_TYPE_FILTER_PRIMITIVE = 64, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_BLEND, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_COLOUR_MATRIX, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_COMPONENT_TRANSFER, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_COMPOSITE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_CONVOLVE_MATRIX, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_DIFFUSE_LIGHTING, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_DISPLACEMENT_MAP, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_ERODE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_FLOOD, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_GAUSSIAN_BLUR, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_IMAGE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_MERGE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_MERGE_NODE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_OFFSET, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_SPECULAR_LIGHTING, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_TILE, + RSVG_NODE_TYPE_FILTER_PRIMITIVE_TURBULENCE, + +} RsvgNodeType; + struct _RsvgPropertyBag { GHashTable *props; }; @@ -254,13 +308,17 @@ struct _RsvgNode { RsvgState *state; RsvgNode *parent; - GString *type; GPtrArray *children; + RsvgNodeType type; + const char *name; /* owned by the xmlContext, invalid after parsing! */ void (*free) (RsvgNode * self); void (*draw) (RsvgNode * self, RsvgDrawingCtx * ctx, int dominate); void (*set_atts) (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag *); }; +#define RSVG_NODE_TYPE(node) ((node)->type) +#define RSVG_NODE_IS_FILTER_PRIMITIVE(node) (RSVG_NODE_TYPE((node)) & RSVG_NODE_TYPE_FILTER_PRIMITIVE) + struct _RsvgNodeChars { RsvgNode super; GString *contents; --- ./rsvg-text.c.orig 2011-10-07 08:34:51.850271569 +0200 +++ ./rsvg-text.c 2011-10-07 10:52:26.075287655 +0200 @@ -180,17 +180,19 @@ rsvg_push_discrete_layer (ctx); for (i = 0; i < self->children->len; i++) { RsvgNode *node = g_ptr_array_index (self->children, i); - if (!strcmp (node->type->str, "RSVG_NODE_CHARS")) { + RsvgNodeType type = RSVG_NODE_TYPE (node); + + if (type == RSVG_NODE_TYPE_CHARS) { RsvgNodeChars *chars = (RsvgNodeChars *) node; GString *str = _rsvg_text_chomp (rsvg_state_current (ctx), chars->contents, lastwasspace); rsvg_text_render_text (ctx, str->str, x, y); g_string_free (str, TRUE); - } else if (!strcmp (node->type->str, "tspan")) { + } else if (type == RSVG_NODE_TYPE_TSPAN) { RsvgNodeText *tspan = (RsvgNodeText *) node; rsvg_state_push (ctx); _rsvg_node_text_type_tspan (tspan, ctx, x, y, lastwasspace); rsvg_state_pop (ctx); - } else if (!strcmp (node->type->str, "tref")) { + } else if (type == RSVG_NODE_TYPE_TREF) { RsvgNodeTref *tref = (RsvgNodeTref *) node; _rsvg_node_text_type_tref (tref, ctx, x, y, lastwasspace); } @@ -216,15 +218,17 @@ int out = FALSE; for (i = 0; i < self->children->len; i++) { RsvgNode *node = g_ptr_array_index (self->children, i); - if (!strcmp (node->type->str, "RSVG_NODE_CHARS")) { + RsvgNodeType type = RSVG_NODE_TYPE (node); + + if (type == RSVG_NODE_TYPE_CHARS) { RsvgNodeChars *chars = (RsvgNodeChars *) node; GString *str = _rsvg_text_chomp (rsvg_state_current (ctx), chars->contents, lastwasspace); *x += rsvg_text_length_text_as_string (ctx, str->str); g_string_free (str, TRUE); - } else if (!strcmp (node->type->str, "tspan")) { + } else if (type == RSVG_NODE_TYPE_TSPAN) { RsvgNodeText *tspan = (RsvgNodeText *) node; out = _rsvg_node_text_length_tspan (tspan, ctx, x, lastwasspace); - } else if (!strcmp (node->type->str, "tref")) { + } else if (type == RSVG_NODE_TYPE_TREF) { RsvgNodeTref *tref = (RsvgNodeTref *) node; out = _rsvg_node_text_length_tref (tref, ctx, x, lastwasspace); } @@ -266,7 +270,7 @@ { RsvgNodeText *text; text = g_new (RsvgNodeText, 1); - _rsvg_node_init (&text->super); + _rsvg_node_init (&text->super, RSVG_NODE_TYPE_TEXT); text->super.draw = _rsvg_node_text_draw; text->super.set_atts = _rsvg_node_text_set_atts; text->x = text->y = text->dx = text->dy = _rsvg_css_parse_length ("0"); @@ -338,7 +342,7 @@ { RsvgNodeText *text; text = g_new (RsvgNodeText, 1); - _rsvg_node_init (&text->super); + _rsvg_node_init (&text->super, RSVG_NODE_TYPE_TSPAN); text->super.set_atts = _rsvg_node_tspan_set_atts; text->x.factor = text->y.factor = 'n'; text->dx = text->dy = _rsvg_css_parse_length ("0"); @@ -381,7 +385,7 @@ { RsvgNodeTref *text; text = g_new (RsvgNodeTref, 1); - _rsvg_node_init (&text->super); + _rsvg_node_init (&text->super, RSVG_NODE_TYPE_TREF); text->super.set_atts = _rsvg_node_tref_set_atts; text->link = NULL; return &text->super; --- ./rsvg-shapes.h.orig 2011-10-07 08:34:51.842271566 +0200 +++ ./rsvg-shapes.h 2011-10-07 10:33:54.693235764 +0200 @@ -33,7 +33,7 @@ G_BEGIN_DECLS -RsvgNode * rsvg_new_path (void); +RsvgNode *rsvg_new_path (void); RsvgNode *rsvg_new_polygon (void); RsvgNode *rsvg_new_polyline (void); RsvgNode *rsvg_new_line (void); --- ./rsvg-paint-server.c.orig 2011-10-07 08:34:51.837271565 +0200 +++ ./rsvg-paint-server.c 2011-10-07 11:39:12.101187395 +0200 @@ -130,11 +130,11 @@ if (val == NULL) return NULL; - if (!strcmp (val->type->str, "linearGradient")) + if (RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_LINEAR_GRADIENT) return rsvg_paint_server_lin_grad ((RsvgLinearGradient *) val); - else if (!strcmp (val->type->str, "radialGradient")) + else if (RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_RADIAL_GRADIENT) return rsvg_paint_server_rad_grad ((RsvgRadialGradient *) val); - else if (!strcmp (val->type->str, "pattern")) + else if (RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_PATTERN) return rsvg_paint_server_pattern ((RsvgPattern *) val); else return NULL; @@ -225,7 +225,7 @@ rsvg_new_stop (void) { RsvgGradientStop *stop = g_new (RsvgGradientStop, 1); - _rsvg_node_init (&stop->super); + _rsvg_node_init (&stop->super, RSVG_NODE_TYPE_STOP); stop->super.set_atts = rsvg_stop_set_atts; stop->offset = 0; stop->rgba = 0; @@ -292,7 +292,7 @@ { RsvgLinearGradient *grad = NULL; grad = g_new (RsvgLinearGradient, 1); - _rsvg_node_init (&grad->super); + _rsvg_node_init (&grad->super, RSVG_NODE_TYPE_LINEAR_GRADIENT); _rsvg_affine_identity (grad->affine); grad->has_current_color = FALSE; grad->x1 = grad->y1 = grad->y2 = _rsvg_css_parse_length ("0"); @@ -373,7 +373,7 @@ { RsvgRadialGradient *grad = g_new (RsvgRadialGradient, 1); - _rsvg_node_init (&grad->super); + _rsvg_node_init (&grad->super, RSVG_NODE_TYPE_RADIAL_GRADIENT); _rsvg_affine_identity (grad->affine); grad->has_current_color = FALSE; grad->obj_bbox = TRUE; @@ -453,7 +453,7 @@ rsvg_new_pattern (void) { RsvgPattern *pattern = g_new (RsvgPattern, 1); - _rsvg_node_init (&pattern->super); + _rsvg_node_init (&pattern->super, RSVG_NODE_TYPE_PATTERN); pattern->obj_bbox = TRUE; pattern->obj_cbbox = FALSE; pattern->x = pattern->y = pattern->width = pattern->height = _rsvg_css_parse_length ("0"); @@ -473,7 +473,8 @@ { unsigned int i; for (i = 0; i < lookin->len; i++) { - if (!strcmp (((RsvgNode *) g_ptr_array_index (lookin, i))->type->str, "stop")) + RsvgNode *node = g_ptr_array_index (lookin, i); + if (RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_STOP) return 1; } return 0; @@ -486,7 +487,7 @@ int i; ufallback = grad->fallback; while (ufallback != NULL) { - if (!strcmp (ufallback->type->str, "linearGradient")) { + if (RSVG_NODE_TYPE (ufallback) == RSVG_NODE_TYPE_LINEAR_GRADIENT) { RsvgLinearGradient *fallback = (RsvgLinearGradient *) ufallback; if (!grad->hasx1 && fallback->hasx1) { grad->hasx1 = TRUE; @@ -521,7 +522,7 @@ grad->super.children = fallback->super.children; } ufallback = fallback->fallback; - } else if (!strcmp (ufallback->type->str, "radialGradient")) { + } else if (RSVG_NODE_TYPE (ufallback) == RSVG_NODE_TYPE_RADIAL_GRADIENT) { RsvgRadialGradient *fallback = (RsvgRadialGradient *) ufallback; if (!grad->hastransform && fallback->hastransform) { grad->hastransform = TRUE; @@ -551,7 +552,7 @@ int i; ufallback = grad->fallback; while (ufallback != NULL) { - if (!strcmp (ufallback->type->str, "radialGradient")) { + if (RSVG_NODE_TYPE (ufallback) == RSVG_NODE_TYPE_RADIAL_GRADIENT) { RsvgRadialGradient *fallback = (RsvgRadialGradient *) ufallback; if (!grad->hascx && fallback->hascx) { grad->hascx = TRUE; @@ -590,7 +591,7 @@ grad->super.children = fallback->super.children; } ufallback = fallback->fallback; - } else if (!strcmp (ufallback->type->str, "linearGradient")) { + } else if (RSVG_NODE_TYPE (ufallback) == RSVG_NODE_TYPE_LINEAR_GRADIENT) { RsvgLinearGradient *fallback = (RsvgLinearGradient *) ufallback; if (!grad->hastransform && fallback->hastransform) { grad->hastransform = TRUE; --- ./rsvg-image.c.orig 2011-10-07 08:34:51.831271563 +0200 +++ ./rsvg-image.c 2011-10-07 10:18:23.179515392 +0200 @@ -553,7 +553,7 @@ { RsvgNodeImage *image; image = g_new (RsvgNodeImage, 1); - _rsvg_node_init (&image->super); + _rsvg_node_init (&image->super, RSVG_NODE_TYPE_IMAGE); image->img = NULL; image->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; image->x = image->y = image->w = image->h = _rsvg_css_parse_length ("0"); --- ./rsvg-mask.c.orig 2011-10-07 08:34:51.835271564 +0200 +++ ./rsvg-mask.c 2011-10-07 10:25:46.550706187 +0200 @@ -73,7 +73,7 @@ RsvgMask *mask; mask = g_new (RsvgMask, 1); - _rsvg_node_init (&mask->super); + _rsvg_node_init (&mask->super, RSVG_NODE_TYPE_MASK); mask->maskunits = objectBoundingBox; mask->contentunits = userSpaceOnUse; mask->x = _rsvg_css_parse_length ("0"); @@ -112,7 +112,7 @@ val = rsvg_defs_lookup (defs, name); g_free (name); - if (val && (!strcmp (val->type->str, "mask"))) + if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_MASK) return val; } return NULL; @@ -129,7 +129,7 @@ val = rsvg_defs_lookup (defs, name); g_free (name); - if (val && (!strcmp (val->type->str, "clipPath"))) + if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_CLIP_PATH) return val; } return NULL; @@ -169,7 +169,7 @@ RsvgClipPath *clip_path; clip_path = g_new (RsvgClipPath, 1); - _rsvg_node_init (&clip_path->super); + _rsvg_node_init (&clip_path->super, RSVG_NODE_TYPE_CLIP_PATH); clip_path->units = userSpaceOnUse; clip_path->super.set_atts = rsvg_clip_path_set_atts; clip_path->super.free = _rsvg_node_free; --- ./rsvg-filter.c.orig 2011-10-07 08:34:51.828271562 +0200 +++ ./rsvg-filter.c 2011-10-07 10:17:30.451880413 +0200 @@ -482,7 +482,7 @@ for (i = 0; i < self->super.children->len; i++) { current = g_ptr_array_index (self->super.children, i); - if (!strncmp (current->super.type->str, "fe", 2)) + if (RSVG_NODE_IS_FILTER_PRIMITIVE (¤t->super)) rsvg_filter_primitive_render (current, ctx); } @@ -645,7 +645,7 @@ val = rsvg_defs_lookup (defs, name); g_free (name); - if (val && (!strcmp (val->type->str, "filter"))) + if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_FILTER) return (RsvgFilter *) val; } return NULL; @@ -696,7 +696,7 @@ RsvgFilter *filter; filter = g_new (RsvgFilter, 1); - _rsvg_node_init (&filter->super); + _rsvg_node_init (&filter->super, RSVG_NODE_TYPE_FILTER); filter->filterunits = objectBoundingBox; filter->primitiveunits = userSpaceOnUse; filter->x = _rsvg_css_parse_length ("-10%"); @@ -971,7 +971,7 @@ { RsvgFilterPrimitiveBlend *filter; filter = g_new (RsvgFilterPrimitiveBlend, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_BLEND); filter->mode = normal; filter->super.in = g_string_new ("none"); filter->in2 = g_string_new ("none"); @@ -1223,7 +1223,7 @@ { RsvgFilterPrimitiveConvolveMatrix *filter; filter = g_new (RsvgFilterPrimitiveConvolveMatrix, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_CONVOLVE_MATRIX); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -1464,7 +1464,7 @@ { RsvgFilterPrimitiveGaussianBlur *filter; filter = g_new (RsvgFilterPrimitiveGaussianBlur, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_OFFSET); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -1600,7 +1600,7 @@ { RsvgFilterPrimitiveOffset *filter; filter = g_new (RsvgFilterPrimitiveOffset, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_OFFSET); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -1641,7 +1641,7 @@ for (i = 0; i < upself->super.super.children->len; i++) { RsvgFilterPrimitive *mn; mn = g_ptr_array_index (upself->super.super.children, i); - if (strcmp (mn->super.type->str, "feMergeNode")) + if (RSVG_NODE_TYPE (&mn->super) != RSVG_NODE_TYPE_FILTER_PRIMITIVE_MERGE_NODE) continue; in = rsvg_filter_get_in (mn->in, ctx); rsvg_alpha_blt (in, boundarys.x0, boundarys.y0, boundarys.x1 - boundarys.x0, @@ -1694,7 +1694,7 @@ { RsvgFilterPrimitiveMerge *filter; filter = g_new (RsvgFilterPrimitiveMerge, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_MERGE); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = filter->super.height.factor = 'n'; @@ -1738,7 +1738,7 @@ { RsvgFilterPrimitive *filter; filter = g_new (RsvgFilterPrimitive, 1); - _rsvg_node_init (&filter->super); + _rsvg_node_init (&filter->super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_MERGE_NODE); filter->in = g_string_new ("none"); filter->super.free = rsvg_filter_primitive_merge_node_free; filter->render = &rsvg_filter_primitive_merge_node_render; @@ -1972,7 +1972,7 @@ { RsvgFilterPrimitiveColourMatrix *filter; filter = g_new (RsvgFilterPrimitiveColourMatrix, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_COLOUR_MATRIX); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -2004,8 +2004,9 @@ gint slope; gint intercept; gint amplitude; - gdouble exponent; gint offset; + gdouble exponent; + char channel; }; struct _RsvgFilterPrimitiveComponentTransfer { @@ -2101,15 +2102,18 @@ for (c = 0; c < 4; c++) { char channel = "RGBA"[c]; for (i = 0; i < self->super.children->len; i++) { - RsvgNodeComponentTransferFunc *temp; - temp = (RsvgNodeComponentTransferFunc *) - g_ptr_array_index (self->super.children, i); - if (!strncmp (temp->super.type->str, "feFunc", 6)) - if (temp->super.type->str[6] == channel) { + RsvgNode *child_node; + + child_node = (RsvgNode *) g_ptr_array_index (self->super.children, i); + if (RSVG_NODE_TYPE (child_node) == RSVG_NODE_TYPE_FILTER_PRIMITIVE_COMPONENT_TRANSFER) { + RsvgNodeComponentTransferFunc *temp = (RsvgNodeComponentTransferFunc *) child_node; + + if (temp->channel == channel) { functions[ctx->channelmap[c]] = temp->function; channels[ctx->channelmap[c]] = temp; break; } + } } if (i == self->super.children->len) functions[c] = identity_component_transfer_func; @@ -2192,7 +2196,7 @@ RsvgFilterPrimitiveComponentTransfer *filter; filter = g_new (RsvgFilterPrimitiveComponentTransfer, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_COMPONENT_TRANSFER); filter->super.result = g_string_new ("none"); filter->super.in = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -2267,7 +2271,7 @@ RsvgNodeComponentTransferFunc *filter; filter = g_new (RsvgNodeComponentTransferFunc, 1); - _rsvg_node_init (&filter->super); + _rsvg_node_init (&filter->super, RSVG_NODE_TYPE_COMPONENT_TRANFER_FUNCTION); filter->super.free = rsvg_component_transfer_function_free; filter->super.set_atts = rsvg_node_component_transfer_function_set_atts; filter->function = identity_component_transfer_func; @@ -2409,7 +2413,7 @@ { RsvgFilterPrimitiveErode *filter; filter = g_new (RsvgFilterPrimitiveErode, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_ERODE); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -2634,7 +2638,7 @@ { RsvgFilterPrimitiveComposite *filter; filter = g_new (RsvgFilterPrimitiveComposite, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_COMPOSITE); filter->mode = COMPOSITE_MODE_OVER; filter->super.in = g_string_new ("none"); filter->in2 = g_string_new ("none"); @@ -2739,7 +2743,7 @@ { RsvgFilterPrimitive *filter; filter = g_new (RsvgFilterPrimitive, 1); - _rsvg_node_init (&filter->super); + _rsvg_node_init (&filter->super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_FLOOD); filter->in = g_string_new ("none"); filter->result = g_string_new ("none"); filter->x.factor = filter->y.factor = filter->width.factor = filter->height.factor = 'n'; @@ -2915,7 +2919,7 @@ { RsvgFilterPrimitiveDisplacementMap *filter; filter = g_new (RsvgFilterPrimitiveDisplacementMap, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_DISPLACEMENT_MAP); filter->super.in = g_string_new ("none"); filter->in2 = g_string_new ("none"); filter->super.result = g_string_new ("none"); @@ -3286,7 +3290,7 @@ { RsvgFilterPrimitiveTurbulence *filter; filter = g_new (RsvgFilterPrimitiveTurbulence, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_TURBULENCE); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -3505,7 +3509,7 @@ { RsvgFilterPrimitiveImage *filter; filter = g_new (RsvgFilterPrimitiveImage, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_IMAGE); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -3866,8 +3870,8 @@ static void -rsvg_filter_primitive_light_source_set_atts (RsvgNode * self, - RsvgHandle * ctx, RsvgPropertyBag * atts) +rsvg_node_light_source_set_atts (RsvgNode * self, + RsvgHandle * ctx, RsvgPropertyBag * atts) { RsvgNodeLightSource *data; const char *value; @@ -3899,13 +3903,13 @@ } RsvgNode * -rsvg_new_filter_primitive_light_source (char type) +rsvg_new_node_light_source (char type) { RsvgNodeLightSource *data; data = g_new (RsvgNodeLightSource, 1); - _rsvg_node_init (&data->super); + _rsvg_node_init (&data->super, RSVG_NODE_TYPE_LIGHT_SOURCE); data->super.free = _rsvg_node_free; - data->super.set_atts = rsvg_filter_primitive_light_source_set_atts; + data->super.set_atts = rsvg_node_light_source_set_atts; data->specularExponent = 1; if (type == 's') data->type = SPOTLIGHT; @@ -3956,9 +3960,9 @@ for (i = 0; i < self->super.children->len; i++) { RsvgNode *temp; temp = g_ptr_array_index (self->super.children, i); - if (!strcmp (temp->type->str, "feDistantLight") || - !strcmp (temp->type->str, "fePointLight") || !strcmp (temp->type->str, "feSpotLight")) + if (RSVG_NODE_TYPE (temp) == RSVG_NODE_TYPE_LIGHT_SOURCE) { source = (RsvgNodeLightSource *) temp; + } } if (source == NULL) return; @@ -4075,7 +4079,7 @@ { RsvgFilterPrimitiveDiffuseLighting *filter; filter = g_new (RsvgFilterPrimitiveDiffuseLighting, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_DIFFUSE_LIGHTING); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -4131,9 +4135,9 @@ for (i = 0; i < self->super.children->len; i++) { RsvgNode *temp; temp = g_ptr_array_index (self->super.children, i); - if (!strcmp (temp->type->str, "feDistantLight") || - !strcmp (temp->type->str, "fePointLight") || !strcmp (temp->type->str, "feSpotLight")) + if (RSVG_NODE_TYPE (temp) == RSVG_NODE_TYPE_LIGHT_SOURCE) { source = (RsvgNodeLightSource *) temp; +} } if (source == NULL) return; @@ -4255,7 +4259,7 @@ { RsvgFilterPrimitiveSpecularLighting *filter; filter = g_new (RsvgFilterPrimitiveSpecularLighting, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_SPECULAR_LIGHTING); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = @@ -4378,7 +4382,7 @@ { RsvgFilterPrimitiveTile *filter; filter = g_new (RsvgFilterPrimitiveTile, 1); - _rsvg_node_init (&filter->super.super); + _rsvg_node_init (&filter->super.super, RSVG_NODE_TYPE_FILTER_PRIMITIVE_TILE); filter->super.in = g_string_new ("none"); filter->super.result = g_string_new ("none"); filter->super.x.factor = filter->super.y.factor = filter->super.width.factor = --- ./rsvg-shapes.c.orig 2011-10-07 08:34:51.840271565 +0200 +++ ./rsvg-shapes.c 2011-10-07 10:33:28.010364928 +0200 @@ -88,7 +88,7 @@ { RsvgNodePath *path; path = g_new (RsvgNodePath, 1); - _rsvg_node_init (&path->super); + _rsvg_node_init (&path->super, RSVG_NODE_TYPE_PATH); path->d = NULL; path->super.free = rsvg_node_path_free; path->super.draw = rsvg_node_path_draw; @@ -100,7 +100,6 @@ struct _RsvgNodePoly { RsvgNode super; gdouble *pointlist; - gboolean is_polyline; guint pointlist_len; }; @@ -125,7 +124,8 @@ rsvg_defs_register_name (ctx->priv->defs, value, self); } - rsvg_parse_style_attrs (ctx, self->state, (poly->is_polyline ? "polyline" : "polygon"), + rsvg_parse_style_attrs (ctx, self->state, + RSVG_NODE_TYPE (self) == RSVG_NODE_TYPE_POLYLINE ? "polyline" : "polygon", klazz, id, atts); } @@ -159,7 +159,7 @@ g_string_append (d, g_ascii_dtostr (buf, sizeof (buf), poly->pointlist[i + 1])); } - if (!poly->is_polyline) + if (RSVG_NODE_TYPE (self) == RSVG_NODE_TYPE_POLYGON) g_string_append (d, " Z"); rsvg_state_reinherit_top (ctx, self->state, dominate); @@ -180,16 +180,15 @@ static RsvgNode * -rsvg_new_any_poly (gboolean is_polyline) +rsvg_new_any_poly (RsvgNodeType type) { RsvgNodePoly *poly; poly = g_new (RsvgNodePoly, 1); - _rsvg_node_init (&poly->super); + _rsvg_node_init (&poly->super, type); poly->super.free = _rsvg_node_poly_free; poly->super.draw = _rsvg_node_poly_draw; poly->super.set_atts = _rsvg_node_poly_set_atts; poly->pointlist = NULL; - poly->is_polyline = is_polyline; poly->pointlist_len = 0; return &poly->super; } @@ -197,13 +196,13 @@ RsvgNode * rsvg_new_polygon (void) { - return rsvg_new_any_poly (FALSE); + return rsvg_new_any_poly (RSVG_NODE_TYPE_POLYGON); } RsvgNode * rsvg_new_polyline (void) { - return rsvg_new_any_poly (TRUE); + return rsvg_new_any_poly (RSVG_NODE_TYPE_POLYLINE); } @@ -274,7 +273,7 @@ { RsvgNodeLine *line; line = g_new (RsvgNodeLine, 1); - _rsvg_node_init (&line->super); + _rsvg_node_init (&line->super, RSVG_NODE_TYPE_LINE); line->super.draw = _rsvg_node_line_draw; line->super.set_atts = _rsvg_node_line_set_atts; line->x1 = line->x2 = line->y1 = line->y2 = _rsvg_css_parse_length ("0"); @@ -447,7 +446,7 @@ { RsvgNodeRect *rect; rect = g_new (RsvgNodeRect, 1); - _rsvg_node_init (&rect->super); + _rsvg_node_init (&rect->super, RSVG_NODE_TYPE_RECT); rect->super.draw = _rsvg_node_rect_draw; rect->super.set_atts = _rsvg_node_rect_set_atts; rect->x = rect->y = rect->w = rect->h = rect->rx = rect->ry = _rsvg_css_parse_length ("0"); @@ -573,7 +572,7 @@ { RsvgNodeCircle *circle; circle = g_new (RsvgNodeCircle, 1); - _rsvg_node_init (&circle->super); + _rsvg_node_init (&circle->super, RSVG_NODE_TYPE_CIRCLE); circle->super.draw = _rsvg_node_circle_draw; circle->super.set_atts = _rsvg_node_circle_set_atts; circle->cx = circle->cy = circle->r = _rsvg_css_parse_length ("0"); @@ -699,7 +698,7 @@ { RsvgNodeEllipse *ellipse; ellipse = g_new (RsvgNodeEllipse, 1); - _rsvg_node_init (&ellipse->super); + _rsvg_node_init (&ellipse->super, RSVG_NODE_TYPE_ELLIPSE); ellipse->super.draw = _rsvg_node_ellipse_draw; ellipse->super.set_atts = _rsvg_node_ellipse_set_atts; ellipse->cx = ellipse->cy = ellipse->rx = ellipse->ry = _rsvg_css_parse_length ("0"); --- ./rsvg-marker.c.orig 2011-10-07 08:34:51.833271563 +0200 +++ ./rsvg-marker.c 2011-10-07 10:21:14.034379785 +0200 @@ -83,7 +83,7 @@ { RsvgMarker *marker; marker = g_new (RsvgMarker, 1); - _rsvg_node_init (&marker->super); + _rsvg_node_init (&marker->super, RSVG_NODE_TYPE_MARKER); marker->orient = 0; marker->orientAuto = FALSE; marker->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; @@ -198,7 +198,7 @@ val = rsvg_defs_lookup (defs, name); g_free (name); - if (val && (!strcmp (val->type->str, "marker"))) + if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_MARKER) return val; } return NULL; --- ./rsvg-base.c.orig 2011-10-07 08:34:51.822271561 +0200 +++ ./rsvg-base.c 2011-10-07 08:35:09.254278156 +0200 @@ -233,11 +233,11 @@ else if (!strcmp (name, "feFuncA")) newnode = rsvg_new_node_component_transfer_function ('a'); else if (!strcmp (name, "feDistantLight")) - newnode = rsvg_new_filter_primitive_light_source ('d'); + newnode = rsvg_new_node_light_source ('d'); else if (!strcmp (name, "feSpotLight")) - newnode = rsvg_new_filter_primitive_light_source ('s'); + newnode = rsvg_new_node_light_source ('s'); else if (!strcmp (name, "fePointLight")) - newnode = rsvg_new_filter_primitive_light_source ('p'); + newnode = rsvg_new_node_light_source ('p'); /* hack to make multiImage sort-of work */ else if (!strcmp (name, "multiImage")) newnode = rsvg_new_switch (); @@ -258,14 +258,15 @@ } if (newnode) { - newnode->type = g_string_new (name); + g_assert (RSVG_NODE_TYPE (newnode) != RSVG_NODE_TYPE_INVALID); + newnode->name = (char *) name; /* libxml will keep this while parsing */ newnode->parent = ctx->priv->currentnode; rsvg_node_set_atts (newnode, ctx, atts); rsvg_defs_register_memory (ctx->priv->defs, newnode); if (ctx->priv->currentnode) { rsvg_node_group_pack (ctx->priv->currentnode, newnode); ctx->priv->currentnode = newnode; - } else if (!strcmp (name, "svg")) { + } else if (RSVG_NODE_TYPE (newnode) == RSVG_NODE_TYPE_SVG) { ctx->priv->treebase = newnode; ctx->priv->currentnode = newnode; } @@ -681,9 +682,9 @@ ctx->priv->handler = NULL; } - if (ctx->priv->currentnode - && !strcmp ((const char *) name, ctx->priv->currentnode->type->str)) - rsvg_pop_def_group (ctx); + if (ctx->priv->currentnode && + !strcmp ((const char *) name, ctx->priv->currentnode->name)) + rsvg_pop_def_group (ctx); } } @@ -696,6 +697,30 @@ _rsvg_node_free (node); } +static RsvgNodeChars * +rsvg_new_node_chars (const char *text, + int len) +{ + RsvgNodeChars *self; + + self = g_new (RsvgNodeChars, 1); + _rsvg_node_init (&self->super, RSVG_NODE_TYPE_CHARS); + + if (!g_utf8_validate (text, len, NULL)) { + char *utf8; + utf8 = rsvg_make_valid_utf8 (text, len); + self->contents = g_string_new (utf8); + g_free (utf8); + } else { + self->contents = g_string_new_len (text, len); + } + + self->super.free = _rsvg_node_chars_free; + self->super.state->cond_true = FALSE; + + return self; +} + static void rsvg_characters_impl (RsvgHandle * ctx, const xmlChar * ch, int len) { @@ -706,9 +731,9 @@ if (ctx->priv->currentnode) { - if (!strcmp ("tspan", ctx->priv->currentnode->type->str) || - !strcmp ("text", ctx->priv->currentnode->type->str)) - { + RsvgNodeType type = RSVG_NODE_TYPE (ctx->priv->currentnode); + if (type == RSVG_NODE_TYPE_TSPAN || + type == RSVG_NODE_TYPE_TEXT) { guint i; /* find the last CHARS node in the text or tspan node, so that we @@ -716,7 +741,7 @@ self = NULL; for (i = 0; i < ctx->priv->currentnode->children->len; i++) { RsvgNode *node = g_ptr_array_index (ctx->priv->currentnode->children, i); - if (!strcmp (node->type->str, "RSVG_NODE_CHARS")) { + if (RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_CHARS) { self = (RsvgNodeChars*)node; } } @@ -736,21 +761,7 @@ } } - self = g_new (RsvgNodeChars, 1); - _rsvg_node_init (&self->super); - - if (!g_utf8_validate ((char *) ch, len, NULL)) { - char *utf8; - utf8 = rsvg_make_valid_utf8 ((char *) ch, len); - self->contents = g_string_new (utf8); - g_free (utf8); - } else { - self->contents = g_string_new_len ((char *) ch, len); - } - - self->super.type = g_string_new ("RSVG_NODE_CHARS"); - self->super.free = _rsvg_node_chars_free; - self->super.state->cond_true = FALSE; + self = rsvg_new_node_chars ((char *) ch, len); rsvg_defs_register_memory (ctx->priv->defs, (RsvgNode *) self); if (ctx->priv->currentnode) --- ./rsvg-filter.h.orig 2011-10-07 08:34:51.830271563 +0200 +++ ./rsvg-filter.h 2011-10-07 10:18:01.148667048 +0200 @@ -63,7 +63,7 @@ RsvgNode *rsvg_new_filter_primitive_turbulence (void); RsvgNode *rsvg_new_filter_primitive_image (void); RsvgNode *rsvg_new_filter_primitive_diffuse_lighting (void); -RsvgNode *rsvg_new_filter_primitive_light_source (char type); +RsvgNode *rsvg_new_node_light_source (char type); RsvgNode *rsvg_new_filter_primitive_specular_lighting (void); RsvgNode *rsvg_new_filter_primitive_tile (void); --- ./rsvg-structure.c.orig 2011-10-07 08:34:51.845271567 +0200 +++ ./rsvg-structure.c 2011-10-07 10:37:43.857147922 +0200 @@ -85,16 +85,17 @@ } void -_rsvg_node_init (RsvgNode * self) +_rsvg_node_init (RsvgNode * self, + RsvgNodeType type) { - self->parent = NULL; + self->type = type; + self->parent = NULL; self->children = g_ptr_array_new (); self->state = g_new (RsvgState, 1); rsvg_state_init (self->state); self->free = _rsvg_node_free; self->draw = _rsvg_node_draw_nothing; self->set_atts = _rsvg_node_dont_set_atts; - self->type = NULL; } void @@ -106,9 +107,6 @@ } if (self->children != NULL) g_ptr_array_free (self->children, TRUE); - if (self->type != NULL) - g_string_free (self->type, TRUE); - } void @@ -140,7 +138,7 @@ { RsvgNodeGroup *group; group = g_new (RsvgNodeGroup, 1); - _rsvg_node_init (&group->super); + _rsvg_node_init (&group->super, RSVG_NODE_TYPE_GROUP); group->super.draw = _rsvg_node_draw_children; group->super.set_atts = rsvg_node_group_set_atts; return &group->super; @@ -149,8 +147,8 @@ void rsvg_pop_def_group (RsvgHandle * ctx) { - if (ctx->priv->currentnode != NULL) - ctx->priv->currentnode = ctx->priv->currentnode->parent; + g_assert (ctx->priv->currentnode != NULL); + ctx->priv->currentnode = ctx->priv->currentnode->parent; } void @@ -201,7 +199,7 @@ return; state = rsvg_state_current (ctx); - if (strcmp (child->type->str, "symbol")) { + if (RSVG_NODE_TYPE (child) != RSVG_NODE_TYPE_SYMBOL) { _rsvg_affine_translate (affine, x, y); _rsvg_affine_multiply (state->affine, affine, state->affine); @@ -354,7 +352,7 @@ { RsvgNodeSvg *svg; svg = g_new (RsvgNodeSvg, 1); - _rsvg_node_init (&svg->super); + _rsvg_node_init (&svg->super, RSVG_NODE_TYPE_SVG); svg->vbox.active = FALSE; svg->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; svg->x = _rsvg_css_parse_length ("0"); @@ -400,7 +398,7 @@ { RsvgNodeUse *use; use = g_new (RsvgNodeUse, 1); - _rsvg_node_init (&use->super); + _rsvg_node_init (&use->super, RSVG_NODE_TYPE_USE); use->super.draw = rsvg_node_use_draw; use->super.set_atts = rsvg_node_use_set_atts; use->x = _rsvg_css_parse_length ("0"); @@ -441,7 +439,7 @@ { RsvgNodeSymbol *symbol; symbol = g_new (RsvgNodeSymbol, 1); - _rsvg_node_init (&symbol->super); + _rsvg_node_init (&symbol->super, RSVG_NODE_TYPE_SYMBOL); symbol->vbox.active = FALSE; symbol->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; symbol->super.draw = _rsvg_node_draw_nothing; @@ -454,7 +452,7 @@ { RsvgNodeGroup *group; group = g_new (RsvgNodeGroup, 1); - _rsvg_node_init (&group->super); + _rsvg_node_init (&group->super, RSVG_NODE_TYPE_DEFS); group->super.draw = _rsvg_node_draw_nothing; group->super.set_atts = rsvg_node_group_set_atts; return &group->super; @@ -489,7 +487,7 @@ { RsvgNodeGroup *group; group = g_new (RsvgNodeGroup, 1); - _rsvg_node_init (&group->super); + _rsvg_node_init (&group->super, RSVG_NODE_TYPE_SWITCH); group->super.draw = _rsvg_node_switch_draw; group->super.set_atts = rsvg_node_group_set_atts; return &group->super; --- ./rsvg-structure.h.orig 2011-10-07 08:34:51.848271567 +0200 +++ ./rsvg-structure.h 2011-10-07 10:49:49.861936147 +0200 @@ -35,7 +35,7 @@ G_BEGIN_DECLS -RsvgNode * rsvg_new_use (void); +RsvgNode *rsvg_new_use (void); RsvgNode *rsvg_new_symbol (void); RsvgNode *rsvg_new_svg (void); RsvgNode *rsvg_new_defs (void); @@ -49,6 +49,7 @@ struct _RsvgNodeGroup { RsvgNode super; + char *name; }; struct _RsvgNodeSymbol { @@ -78,7 +79,7 @@ void _rsvg_node_draw_children (RsvgNode * self, RsvgDrawingCtx * ctx, int dominate); void _rsvg_node_finalize (RsvgNode * self); void _rsvg_node_free (RsvgNode * self); -void _rsvg_node_init (RsvgNode * self); +void _rsvg_node_init (RsvgNode * self, RsvgNodeType type); G_END_DECLS
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor