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