void rsvg_defs_resolve_all (RsvgDefs * defs) { while (defs->toresolve) { RsvgResolutionPending *data; data = defs->toresolve->data; *(data->tochange) = rsvg_defs_lookup (defs, data->name); g_free (data->name); g_free (data); defs->toresolve = g_slist_delete_link (defs->toresolve, defs->toresolve); } }
RsvgNode * rsvg_clip_path_parse (const RsvgDefs * defs, const char *str) { char *name; name = rsvg_get_url_string (str); if (name) { RsvgNode *val; val = rsvg_defs_lookup (defs, name); g_free (name); if (val && (!strcmp (val->type->str, "clipPath"))) return val; } return NULL; }
RsvgNode * rsvg_marker_parse (const RsvgDefs * defs, const char *str) { char *name; name = rsvg_get_url_string (str); if (name) { RsvgNode *val; val = rsvg_defs_lookup (defs, name); g_free (name); if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_MARKER) return val; } return NULL; }
/** * rsvg_handle_render_cairo_sub: * @handle: A RsvgHandle * @cr: A Cairo renderer * @id: An element's id within the SVG, or %NULL to render the whole SVG. For * example, if you have a layer called "layer1" that you wish to render, pass * "##layer1" as the id. * * Draws a subset of a SVG to a Cairo surface * * Returns: %TRUE if drawing succeeded. * * Since: 2.14 */ gboolean rsvg_handle_render_cairo_sub (RsvgHandle * handle, cairo_t * cr, const char *id) { RsvgDrawingCtx *draw; RsvgNode *drawsub = NULL; g_return_val_if_fail (handle != NULL, FALSE); if (!handle->priv->finished) return FALSE; if (id && *id) drawsub = rsvg_defs_lookup (handle->priv->defs, id); if (drawsub == NULL && id != NULL) { /* todo: there's no way to signal that @id doesn't exist */ return FALSE; } draw = rsvg_cairo_new_drawing_ctx (cr, handle); if (!draw) return FALSE; while (drawsub != NULL) { draw->drawsub_stack = g_slist_prepend (draw->drawsub_stack, drawsub); drawsub = drawsub->parent; } rsvg_state_push (draw); cairo_save (cr); rsvg_node_draw ((RsvgNode *) handle->priv->treebase, draw, 0); cairo_restore (cr); rsvg_state_pop (draw); rsvg_drawing_ctx_free (draw); return TRUE; }