diff options
Diffstat (limited to 'rsvg-marker.c')
-rw-r--r-- | rsvg-marker.c | 158 |
1 files changed, 59 insertions, 99 deletions
diff --git a/rsvg-marker.c b/rsvg-marker.c index dfae2fb8..90c1f468 100644 --- a/rsvg-marker.c +++ b/rsvg-marker.c @@ -36,64 +36,42 @@ #include <math.h> #include <errno.h> -static void -rsvg_marker_free(RsvgNode* self) -{ - RsvgMarker *marker; - marker = (RsvgMarker *)self; - g_free(self); -} - -void -rsvg_start_marker (RsvgHandle *ctx, RsvgPropertyBag *atts) +static void +rsvg_node_marker_set_atts (RsvgNode * self, RsvgHandle *ctx, RsvgPropertyBag *atts) { const char *klazz = NULL, *id = NULL, *value; RsvgMarker *marker; double font_size; - double x = 0., y = 0., w = 0., h = 0.; - double vbx = 0., vby = 0., vbw = 1., vbh = 1.; - gboolean obj_bbox = TRUE; - RsvgState state; - gboolean got_x, got_y, got_bbox, got_vbox, got_width, got_height; - got_x = got_y = got_bbox = got_vbox = got_width = got_height = FALSE; - font_size = rsvg_state_current_font_size (ctx); - marker = g_new (RsvgMarker, 1); - - rsvg_state_init(&state); - - marker->orient = 0; - marker->orientAuto = FALSE; - marker->overflow = FALSE; - marker->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; + marker = (RsvgMarker *)self; if (rsvg_property_bag_size (atts)) { if ((value = rsvg_property_bag_lookup (atts, "id"))) - id = value; + { + id = value; + rsvg_defs_register_name (ctx->defs, id, &marker->super); + } if ((value = rsvg_property_bag_lookup (atts, "class"))) klazz = value; if ((value = rsvg_property_bag_lookup (atts, "viewBox"))) { - got_vbox = rsvg_css_parse_vbox (value, &vbx, &vby, - &vbw, &vbh); + marker->vbox = rsvg_css_parse_vbox (value, &marker->vbx, &marker->vby, + &marker->vbw, &marker->vbh); + if (marker->vbox) + { + ctx->width = marker->vbw; + ctx->height = marker->vbh; + } } - if ((value = rsvg_property_bag_lookup (atts, "refX"))) { - x = rsvg_css_parse_normalized_length (value, ctx->dpi_x, 1, font_size); - got_x = TRUE; - } - if ((value = rsvg_property_bag_lookup (atts, "refY"))) { - y = rsvg_css_parse_normalized_length (value, ctx->dpi_y, 1, font_size); - got_y = TRUE; - } - if ((value = rsvg_property_bag_lookup (atts, "markerWidth"))) { - w = rsvg_css_parse_normalized_length (value, ctx->dpi_x, 1, font_size); - got_width = TRUE; - } - if ((value = rsvg_property_bag_lookup (atts, "markerHeight"))) { - h = rsvg_css_parse_normalized_length (value, ctx->dpi_y, 1, font_size); - got_height = TRUE; - } + if ((value = rsvg_property_bag_lookup (atts, "refX"))) + marker->refX = rsvg_css_parse_normalized_length (value, ctx->dpi_x, 1, font_size); + if ((value = rsvg_property_bag_lookup (atts, "refY"))) + marker->refY = rsvg_css_parse_normalized_length (value, ctx->dpi_y, 1, font_size); + if ((value = rsvg_property_bag_lookup (atts, "markerWidth"))) + marker->width = rsvg_css_parse_normalized_length (value, ctx->dpi_x, 1, font_size); + if ((value = rsvg_property_bag_lookup (atts, "markerHeight"))) + marker->height = rsvg_css_parse_normalized_length (value, ctx->dpi_y, 1, font_size); if ((value = rsvg_property_bag_lookup (atts, "orient"))) { if (!strcmp (value, "auto")) marker->orientAuto = TRUE; @@ -102,65 +80,44 @@ rsvg_start_marker (RsvgHandle *ctx, RsvgPropertyBag *atts) } if ((value = rsvg_property_bag_lookup (atts, "markerUnits"))) { if (!strcmp (value, "userSpaceOnUse")) - obj_bbox = FALSE; + marker->bbox = FALSE; else - obj_bbox = TRUE; - got_bbox = TRUE; + marker->bbox = TRUE; } if ((value = rsvg_property_bag_lookup (atts, "preserveAspectRatio"))) marker->preserve_aspect_ratio = rsvg_css_parse_aspect_ratio (value); if ((value = rsvg_property_bag_lookup (atts, "overflow"))) marker->overflow = rsvg_css_parse_overflow(value); } - - if (got_x) - marker->refX = x; - else - marker->refX = 0; - - if (got_y) - marker->refY = y; - else - marker->refY = 0; - - if (got_width) - marker->width = w; - else - marker->width = 1; - - if (got_height) - marker->height = h; - else - marker->height = 1; - - if (got_bbox) - marker->bbox = obj_bbox; - else - marker->bbox = TRUE; +} - if (got_vbox) - { - marker->vbx = vbx; - marker->vby = vby; - marker->vbw = vbw; - marker->vbh = vbh; - marker->vbox = TRUE; - ctx->width = vbw; - ctx->height = vbh; - } - else - marker->vbox = FALSE; - - /* set up the defval stuff */ +RsvgNode * +rsvg_new_marker (void) +{ + RsvgMarker *marker; + marker = g_new (RsvgMarker, 1); + marker->super.state = g_new(RsvgState, 1); + rsvg_state_init(marker->super.state); + marker->orient = 0; + marker->orientAuto = FALSE; + marker->overflow = FALSE; + marker->preserve_aspect_ratio = RSVG_ASPECT_RATIO_XMID_YMID; + marker->refX = 0; + marker->refY = 0; + marker->width = 1; + marker->height = 1; + marker->bbox = TRUE; + marker->vbox = FALSE; marker->super.type = RSVG_NODE_MARKER; - - marker->contents = (RsvgNode *)rsvg_push_part_def_group(ctx, NULL, &state); - - marker->super.free = rsvg_marker_free; - - rsvg_defs_set (ctx->defs, id, &marker->super); + marker->super.children = g_ptr_array_new(); + marker->super.free = rsvg_node_free; + marker->super.draw = _rsvg_node_draw_nothing; + marker->super.add_child = rsvg_node_add_child; + marker->super.set_atts = rsvg_node_marker_set_atts; + return &marker->super; } + static void rsvg_state_reassemble(RsvgNode * self, RsvgState * state) { @@ -182,7 +139,7 @@ rsvg_marker_render (RsvgMarker *self, gdouble x, gdouble y, gdouble orient, gdou { gdouble affine[6]; gdouble taffine[6]; - int i; + unsigned int i; gdouble rotation; RsvgState * state = rsvg_state_current(ctx); @@ -235,11 +192,6 @@ rsvg_marker_render (RsvgMarker *self, gdouble x, gdouble y, gdouble orient, gdou _rsvg_affine_multiply(affine, affine, taffine); - /*don't inherit anything from the current context*/ - rsvg_state_finalize(state); - rsvg_state_init(state); - rsvg_state_reassemble((RsvgNode *)self->contents, state); - rsvg_state_push(ctx); state = rsvg_state_current(ctx); @@ -248,7 +200,15 @@ rsvg_marker_render (RsvgMarker *self, gdouble x, gdouble y, gdouble orient, gdou state->affine[i] = affine[i]; } - rsvg_node_draw (self->contents, ctx, 3); + for (i = 0; i < self->super.children->len; i++) + { + rsvg_state_push(ctx); + + rsvg_node_draw (g_ptr_array_index(self->super.children, i), + ctx, 0); + + rsvg_state_pop(ctx); + } rsvg_state_pop(ctx); } |