svg_status_t _svg_group_apply_use_attributes (svg_element_t *group, const char **attributes) { const char *href; svg_element_t *ref; svg_element_t *clone; svgint_status_t status = SVG_STATUS_SUCCESS; _svg_attribute_get_string (attributes, "xlink:href", &href, ""); _svg_fetch_element_by_id (group->doc, href + 1, &ref); if (!ref) { /* XXX: Should we report an error here? */ return SVG_STATUS_SUCCESS; } _svg_attribute_get_length (attributes, "width", &group->e.group.width, "100%"); _svg_attribute_get_length (attributes, "height", &group->e.group.height, "100%"); clone = ref; _svg_element_reference(ref); if (status) return status; if (clone) { _svg_group_add_element (&group->e.group, clone); } return SVG_STATUS_SUCCESS; }
static svg_status_t _svg_parser_new_svg_group_element (svg_parser_t *parser, svg_element_t **group_element) { svg_status_t status; svg_element_t *parent; parent = parser->state->group_element; status = _svg_element_create (group_element, SVG_ELEMENT_TYPE_SVG_GROUP, parent, parser->svg); if (status) return status; if (parent) { status = _svg_group_add_element (&parent->e.group, *group_element); } else { _svg_style_init_defaults (&(*group_element)->style, parser->svg); parser->svg->group_element = *group_element; } parser->state->group_element = *group_element; return status; }
svg_status_t _svg_group_init_copy (svg_group_t *group, svg_group_t *other) { svg_status_t status; svg_element_t *clone; int i; group->element = NULL; group->num_elements = 0; group->element_size = 0; /* clone children */ for (i=0; i < other->num_elements; i++) { status = _svg_element_clone (NULL, &clone, other->element[i]); if (status) return status; status = _svg_group_add_element (group, clone); if (status) return status; // point the parent correctly svg_element_t *group_e = container_of(group, svg_element_t, e.group); clone->parent = group_e; } group->width = other->width; group->height = other->height; group->view_box = other->view_box; group->x = other->x; group->y = other->y; return SVG_STATUS_SUCCESS; }
static svg_status_t _svg_parser_new_leaf_element (svg_parser_t *parser, svg_element_t **child_element, svg_element_type_t type) { svg_status_t status; status = _svg_element_create (child_element, type, parser->state->group_element, parser->svg); if (status) return status; status = _svg_group_add_element (&parser->state->group_element->e.group, *child_element); if (status) return status; return SVG_STATUS_SUCCESS; }