diff --git a/src/sp-use.cpp b/src/sp-use.cpp
index 52f8f11e46116ef66a180302436d31033f6f7d47..cd5f818356115b19588de9b10d4f9088561c025c 100644 (file)
--- a/src/sp-use.cpp
+++ b/src/sp-use.cpp
#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"
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);
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
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 *
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);
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);
}
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));
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);
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.
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: