Code

more unreffing temporary styles properly
[inkscape.git] / src / sp-use.cpp
index 52f8f11e46116ef66a180302436d31033f6f7d47..cd5f818356115b19588de9b10d4f9088561c025c 100644 (file)
@@ -26,6 +26,7 @@
 #include "sp-object-repr.h"
 #include "sp-flowregion.h"
 #include "uri.h"
+#include "print.h"
 #include "xml/repr.h"
 #include "prefs-utils.h"
 #include "style.h"
@@ -47,6 +48,7 @@ static void sp_use_update(SPObject *object, SPCtx *ctx, guint flags);
 static void sp_use_modified(SPObject *object, guint flags);
 
 static void sp_use_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags);
+static void sp_use_snappoints(SPItem const *item, SnapPointsIter p);
 static void sp_use_print(SPItem *item, SPPrintContext *ctx);
 static gchar *sp_use_description(SPItem *item);
 static NRArenaItem *sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags);
@@ -106,6 +108,7 @@ sp_use_class_init(SPUseClass *classname)
     item_class->print = sp_use_print;
     item_class->show = sp_use_show;
     item_class->hide = sp_use_hide;
+    item_class->snappoints = sp_use_snappoints;
 }
 
 static void
@@ -240,7 +243,8 @@ sp_use_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
     SPUse *use = SP_USE(object);
 
     if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
-        repr = sp_repr_new("svg:use");
+        Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));
+        repr = xml_doc->createElement("svg:use");
     }
 
     if (((SPObjectClass *) (parent_class))->write) {
@@ -279,11 +283,23 @@ sp_use_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsig
 static void
 sp_use_print(SPItem *item, SPPrintContext *ctx)
 {
+    bool translated = false;
+    NRMatrix tp;
     SPUse *use = SP_USE(item);
 
+    if ((use->x._set && use->x.computed != 0) || (use->y._set && use->y.computed != 0)) {
+        nr_matrix_set_translate(&tp, use->x.computed, use->y.computed);
+        sp_print_bind(ctx, &tp, 1.0);
+        translated = true;
+    }
+
     if (use->child && SP_IS_ITEM(use->child)) {
         sp_item_invoke_print(SP_ITEM(use->child), ctx);
     }
+
+    if (translated) {
+        sp_print_release(ctx);
+    }
 }
 
 static gchar *
@@ -320,6 +336,7 @@ sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags)
 
     NRArenaItem *ai = NRArenaGroup::create(arena);
     nr_arena_group_set_transparent(NR_ARENA_GROUP(ai), FALSE);
+    nr_arena_group_set_style(NR_ARENA_GROUP(ai), SP_OBJECT_STYLE(item));
 
     if (use->child) {
         NRArenaItem *ac = sp_item_invoke_show(SP_ITEM(use->child), arena, key, flags);
@@ -553,6 +570,12 @@ sp_use_update(SPObject *object, SPCtx *ctx, unsigned flags)
     if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
     flags &= SP_OBJECT_MODIFIED_CASCADE;
 
+    if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) {
+      for (SPItemView *v = SP_ITEM(object)->display; v != NULL; v = v->next) {
+       nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), SP_OBJECT_STYLE(object));
+      }
+    }
+
     /* Set up child viewport */
     if (use->x.unit == SVGLength::PERCENT) {
         use->x.computed = use->x.value * (ictx->vp.x1 - ictx->vp.x0);
@@ -606,6 +629,12 @@ sp_use_modified(SPObject *object, guint flags)
     }
     flags &= SP_OBJECT_MODIFIED_CASCADE;
 
+    if (flags & SP_OBJECT_STYLE_MODIFIED_FLAG) {
+      for (SPItemView *v = SP_ITEM(object)->display; v != NULL; v = v->next) {
+       nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), SP_OBJECT_STYLE(object));
+      }
+    }
+
     SPObject *child = use_obj->child;
     if (child) {
         g_object_ref(G_OBJECT(child));
@@ -626,6 +655,7 @@ sp_use_unlink(SPUse *use)
 
     Inkscape::XML::Node *parent = sp_repr_parent(repr);
     SPDocument *document = SP_OBJECT(use)->document;
+    Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
 
     // Track the ultimate source of a chain of uses.
     SPItem *orig = sp_use_root(use);
@@ -635,13 +665,13 @@ sp_use_unlink(SPUse *use)
 
     Inkscape::XML::Node *copy = NULL;
     if (SP_IS_SYMBOL(orig)) { // make a group, copy children
-        copy = sp_repr_new("svg:g");
+        copy = xml_doc->createElement("svg:g");
         for (Inkscape::XML::Node *child = SP_OBJECT_REPR(orig)->firstChild() ; child != NULL; child = child->next()) {
-                Inkscape::XML::Node *newchild = child->duplicate();
+                Inkscape::XML::Node *newchild = child->duplicate(xml_doc);
                 copy->appendChild(newchild);
         }
     } else { // just copy
-        copy = SP_OBJECT_REPR(orig)->duplicate();
+        copy = SP_OBJECT_REPR(orig)->duplicate(xml_doc);
     }
 
     // Add the duplicate repr just after the existing one.
@@ -699,6 +729,22 @@ sp_use_get_original(SPUse *use)
     return ref;
 }
 
+static void
+sp_use_snappoints(SPItem const *item, SnapPointsIter p)
+{
+    g_assert (item != NULL);
+    g_assert (SP_IS_ITEM(item));
+    g_assert (SP_IS_USE(item));
+    
+    SPUse *use = SP_USE(item);
+    SPItem *root = sp_use_root(use);
+    
+    SPItemClass const &item_class = *(SPItemClass const *) G_OBJECT_GET_CLASS(root);
+    if (item_class.snappoints) {
+        item_class.snappoints(root, p);
+    }
+}
+
 
 /*
   Local Variables: