/** * Fills in the data for an SPObject from its Inkscape::XML::Node object. * It fills in data such as version, x, y, width, height, etc. * It then calls the object's parent class object's build function. */ static void sp_root_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) { SPGroup *group = (SPGroup *) object; SPRoot *root = (SPRoot *) object; //XML Tree being used directly here while it shouldn't be. if ( !object->getRepr()->attribute("version") ) { repr->setAttribute("version", SVG_VERSION); } object->readAttr( "version" ); object->readAttr( "inkscape:version" ); /* It is important to parse these here, so objects will have viewport build-time */ object->readAttr( "x" ); object->readAttr( "y" ); object->readAttr( "width" ); object->readAttr( "height" ); object->readAttr( "viewBox" ); object->readAttr( "preserveAspectRatio" ); object->readAttr( "onload" ); if (((SPObjectClass *) parent_class)->build) (* ((SPObjectClass *) parent_class)->build) (object, document, repr); // Search for first <defs> node for (SPObject *o = group->firstChild() ; o ; o = o->getNext() ) { if (SP_IS_DEFS(o)) { root->defs = SP_DEFS(o); break; } } // clear transform, if any was read in - SVG does not allow transform= on <svg> SP_ITEM(object)->transform = Geom::identity(); }
/** * This routine is for adding a child SVG object to an SPRoot object. * The SPRoot object is taken to be an SPGroup. */ static void sp_root_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPRoot *root = (SPRoot *) object; SPGroup *group = (SPGroup *) object; if (((SPObjectClass *) (parent_class))->child_added) { (* ((SPObjectClass *) (parent_class))->child_added)(object, child, ref); } SPObject *co = object->document->getObjectByRepr(child); g_assert (co != NULL || !strcmp("comment", child->name())); // comment repr node has no object if (co && SP_IS_DEFS(co)) { // We search for first <defs> node - it is not beautiful, but works for (SPObject *c = group->firstChild() ; c ; c = c->getNext() ) { if (SP_IS_DEFS(c)) { root->defs = SP_DEFS(c); break; } } } }
void vacuum_document_recursive(SPObject *obj) { if (SP_IS_DEFS(obj)) { for (SPObject *def = obj->firstChild(); def; def = SP_OBJECT_NEXT(def)) { /* fixme: some inkscape-internal nodes in the future might not be collectable */ def->requestOrphanCollection(); } } else { for (SPObject *i = sp_object_first_child(obj); i != NULL; i = SP_OBJECT_NEXT(i)) { vacuum_document_recursive(i); } } }
/** * Hide all items that are not listed in list, recursively, skipping groups and defs. */ static void hide_other_items_recursively(SPObject *o, GSList *list, unsigned dkey) { if ( SP_IS_ITEM(o) && !SP_IS_DEFS(o) && !SP_IS_ROOT(o) && !SP_IS_GROUP(o) && !g_slist_find(list, o) ) { SP_ITEM(o)->invoke_hide(dkey); } // recurse if (!g_slist_find(list, o)) { for ( SPObject *child = o->firstChild() ; child; child = child->getNext() ) { hide_other_items_recursively(child, list, dkey); } } }
/** * Hide all items that are not listed in list, recursively, skipping groups and defs. */ static void hide_other_items_recursively(SPObject *o, const std::vector<SPItem*> &list, unsigned dkey) { if ( SP_IS_ITEM(o) && !SP_IS_DEFS(o) && !SP_IS_ROOT(o) && !SP_IS_GROUP(o) && list.end()==find(list.begin(),list.end(),o)) { SP_ITEM(o)->invoke_hide(dkey); } // recurse if (list.end()==find(list.begin(),list.end(),o)) { for ( SPObject *child = o->firstChild() ; child; child = child->getNext() ) { hide_other_items_recursively(child, list, dkey); } } }
GSList * all_items (SPObject *r, GSList *l, bool hidden, bool locked) { SPDesktop *desktop = SP_ACTIVE_DESKTOP; if (SP_IS_DEFS(r)) return l; // we're not interested in items in defs if (!strcmp (SP_OBJECT_REPR (r)->name(), "svg:metadata")) return l; // we're not interested in metadata for (SPObject *child = sp_object_first_child(r); child; child = SP_OBJECT_NEXT (child)) { if (SP_IS_ITEM (child) && !SP_OBJECT_IS_CLONED (child) && !desktop->isLayer(SP_ITEM(child))) { if ((hidden || !desktop->itemIsHidden(SP_ITEM(child))) && (locked || !SP_ITEM(child)->isLocked())) { l = g_slist_prepend (l, child); } } l = all_items (child, l, hidden, locked); } return l; }
/** * Removes the given child from this SPRoot object. */ static void sp_root_remove_child(SPObject *object, Inkscape::XML::Node *child) { SPRoot *root = (SPRoot *) object; if ( root->defs && (root->defs->getRepr() == child) ) { SPObject *iter = 0; // We search for first remaining <defs> node - it is not beautiful, but works for ( iter = object->firstChild() ; iter ; iter = iter->getNext() ) { if ( SP_IS_DEFS(iter) && (SPDefs *)iter != root->defs ) { root->defs = (SPDefs *)iter; break; } } if (!iter) { /* we should probably create a new <defs> here? */ root->defs = NULL; } } if (((SPObjectClass *) (parent_class))->remove_child) { (* ((SPObjectClass *) (parent_class))->remove_child)(object, child); } }