static void svg_sani_render_path(GF_Node *node, void *rs, Bool is_destroy) { SVG_SANI_pathElement *path = (SVG_SANI_pathElement *)node; Drawable *cs = (Drawable *)gf_node_get_private(node); RenderEffect2D *eff = (RenderEffect2D *)rs; if (is_destroy) { svg_sani_destroy_path(node); return; } if (eff->traversing_mode==TRAVERSE_DRAW) { drawable_draw(eff); return; } else if (eff->traversing_mode==TRAVERSE_PICK) { drawable_pick(eff); return; } svg_sani_render_base(node, eff); if (gf_node_dirty_get(node) & GF_SG_SVG_GEOMETRY_DIRTY) { #if USE_GF_PATH cs->path = &path->d; #else drawable_reset_path(cs); gf_svg_path_build(cs->path, path->d.commands, path->d.points); #endif if (path->fill_rule==GF_PATH_FILL_ZERO_NONZERO) cs->path->flags |= GF_PATH_FILL_ZERO_NONZERO; gf_node_dirty_clear(node, GF_SG_SVG_GEOMETRY_DIRTY); cs->flags |= DRAWABLE_HAS_CHANGED; } svg_sani_DrawablePostRender(cs, (SVG_SANI_TransformableElement *)path, eff, 0, (path->pathLength.type==SVG_NUMBER_VALUE) ? path->pathLength.value : 0); }
static void svg_path_rebuild(GF_Node *node, Drawable *stack, SVGAllAttributes *atts) { #if USE_GF_PATH drawable_reset_path_outline(stack); stack->path = atts->d; #else drawable_reset_path(stack); gf_svg_path_build(stack->path, atts->d->commands, atts->d->points); #endif }