diff options
Diffstat (limited to 'src/sp-use.cpp')
| -rw-r--r-- | src/sp-use.cpp | 108 |
1 files changed, 55 insertions, 53 deletions
diff --git a/src/sp-use.cpp b/src/sp-use.cpp index 33a05cc7b..a05b28a5f 100644 --- a/src/sp-use.cpp +++ b/src/sp-use.cpp @@ -49,7 +49,7 @@ static Inkscape::XML::Node *sp_use_write(SPObject *object, Inkscape::XML::Docume 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, Geom::Matrix const &transform, unsigned const flags); +static void sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags); static void sp_use_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs); static void sp_use_print(SPItem *item, SPPrintContext *ctx); static gchar *sp_use_description(SPItem *item); @@ -62,7 +62,7 @@ static void sp_use_delete_self(SPObject *deleted, SPUse *self); static SPItemClass *parent_class; -//void m_print(gchar *say, Geom::Matrix m) +//void m_print(gchar *say, Geom::Affine m) //{ g_print("%s %g %g %g %g %g %g\n", say, m[0], m[1], m[2], m[3], m[4], m[5]); } GType @@ -127,7 +127,7 @@ sp_use_init(SPUse *use) new (&use->_transformed_connection) sigc::connection(); - use->ref = new SPUseReference(SP_OBJECT(use)); + use->ref = new SPUseReference(use); use->_changed_connection = use->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(sp_use_href_changed), use)); } @@ -135,15 +135,16 @@ sp_use_init(SPUse *use) static void sp_use_finalize(GObject *obj) { - SPUse *use = (SPUse *) obj; + SPUse *use = reinterpret_cast<SPUse *>(obj); if (use->child) { - SP_OBJECT(obj)->detach(use->child); + use->detach(use->child); use->child = NULL; } use->ref->detach(); delete use->ref; + use->ref = 0; use->_delete_connection.~connection(); use->_changed_connection.~connection(); @@ -276,13 +277,13 @@ sp_use_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:: } static void -sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Matrix const &transform, unsigned const flags) +sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Affine const &transform, unsigned const flags) { SPUse const *use = SP_USE(item); if (use->child && SP_IS_ITEM(use->child)) { SPItem *child = SP_ITEM(use->child); - Geom::Matrix const ct( child->transform + Geom::Affine const ct( child->transform * Geom::Translate(use->x.computed, use->y.computed) * transform ); @@ -304,7 +305,7 @@ sp_use_print(SPItem *item, SPPrintContext *ctx) SPUse *use = SP_USE(item); if ((use->x._set && use->x.computed != 0) || (use->y._set && use->y.computed != 0)) { - Geom::Matrix tp(Geom::Translate(use->x.computed, use->y.computed)); + Geom::Affine tp(Geom::Translate(use->x.computed, use->y.computed)); sp_print_bind(ctx, tp, 1.0); translated = true; } @@ -352,7 +353,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)); + nr_arena_group_set_style(NR_ARENA_GROUP(ai), item->style); if (use->child) { NRArenaItem *ac = SP_ITEM(use->child)->invoke_show(arena, key, flags); @@ -361,7 +362,7 @@ sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags) } Geom::Translate t(use->x.computed, use->y.computed); - nr_arena_group_set_child_transform(NR_ARENA_GROUP(ai), Geom::Matrix(t)); + nr_arena_group_set_child_transform(NR_ARENA_GROUP(ai), Geom::Affine(t)); } return ai; @@ -405,7 +406,7 @@ sp_use_root(SPUse *use) * Returns the effective transform that goes from the ultimate original to given SPUse, both ends * included. */ -Geom::Matrix +Geom::Affine sp_use_get_root_transform(SPUse *use) { //track the ultimate source of a chain of uses @@ -420,7 +421,7 @@ sp_use_get_root_transform(SPUse *use) //calculate the accummulated transform, starting from the original - Geom::Matrix t(Geom::identity()); + Geom::Affine t(Geom::identity()); for (GSList *i = chain; i != NULL; i = i->next) { SPItem *i_tem = SP_ITEM(i->data); @@ -445,10 +446,10 @@ sp_use_get_root_transform(SPUse *use) * Returns the transform that leads to the use from its immediate original. * Does not inlcude the original's transform if any. */ -Geom::Matrix +Geom::Affine sp_use_get_parent_transform(SPUse *use) { - Geom::Matrix t(Geom::identity()); + Geom::Affine t(Geom::identity()); if ((use->x._set && use->x.computed != 0) || (use->y._set && use->y.computed != 0)) { t *= Geom::Translate(use->x._set ? use->x.computed : 0, use->y._set ? use->y.computed : 0); @@ -464,16 +465,16 @@ sp_use_get_parent_transform(SPUse *use) * clone's transform. */ static void -sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self) +sp_use_move_compensate(Geom::Affine const *mp, SPItem */*original*/, SPUse *self) { // the clone is orphaned; or this is not a real use, but a clone of another use; // we skip it, otherwise duplicate compensation will occur - if (SP_OBJECT_IS_CLONED(self)) { + if (self->cloned) { return; } // never compensate uses which are used in flowtext - if (SP_OBJECT_PARENT(self) && SP_IS_FLOWREGION(SP_OBJECT_PARENT(self))) { + if (self->parent && SP_IS_FLOWREGION(self->parent)) { return; } @@ -483,20 +484,20 @@ sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self if (mode == SP_CLONE_COMPENSATION_NONE) return; - Geom::Matrix m(*mp); + Geom::Affine m(*mp); // this is not a simple move, do not try to compensate if (!(m.isTranslation())) return; // restore item->transform field from the repr, in case it was changed by seltrans - SP_OBJECT (self)->readAttr ("transform"); + self->readAttr ("transform"); - Geom::Matrix t = sp_use_get_parent_transform(self); - Geom::Matrix clone_move = t.inverse() * m * t; + Geom::Affine t = sp_use_get_parent_transform(self); + Geom::Affine clone_move = t.inverse() * m * t; // calculate the compensation matrix and the advertized movement matrix - Geom::Matrix advertized_move; + Geom::Affine advertized_move; if (mode == SP_CLONE_COMPENSATION_PARALLEL) { clone_move = clone_move.inverse() * m; advertized_move = m; @@ -508,10 +509,9 @@ sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self } // commit the compensation - SPItem *item = SP_ITEM(self); - item->transform *= clone_move; - item->doWriteTransform(SP_OBJECT_REPR(item), item->transform, &advertized_move); - SP_OBJECT(item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + self->transform *= clone_move; + self->doWriteTransform(self->getRepr(), self->transform, &advertized_move); + self->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } static void @@ -523,21 +523,21 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) use->_transformed_connection.disconnect(); if (use->child) { - SP_OBJECT(use)->detach(use->child); + use->detach(use->child); use->child = NULL; } if (use->href) { SPItem *refobj = use->ref->getObject(); if (refobj) { - Inkscape::XML::Node *childrepr = SP_OBJECT_REPR(refobj); + Inkscape::XML::Node *childrepr = refobj->getRepr(); GType type = sp_repr_type_lookup(childrepr); g_return_if_fail(type > G_TYPE_NONE); if (g_type_is_a(type, SP_TYPE_ITEM)) { use->child = (SPObject*) g_object_new(type, 0); - SP_OBJECT(use)->attach(use->child, use->lastChild()); - sp_object_unref(use->child, SP_OBJECT(use)); - (use->child)->invoke_build(SP_OBJECT(use)->document, childrepr, TRUE); + use->attach(use->child, use->lastChild()); + sp_object_unref(use->child, use); + (use->child)->invoke_build(use->document, childrepr, TRUE); for (SPItemView *v = item->display; v != NULL; v = v->next) { NRArenaItem *ai; @@ -548,7 +548,7 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) } } - use->_delete_connection = SP_OBJECT(refobj)->connectDelete(sigc::bind(sigc::ptr_fun(&sp_use_delete_self), use)); + use->_delete_connection = refobj->connectDelete(sigc::bind(sigc::ptr_fun(&sp_use_delete_self), use)); use->_transformed_connection = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_use_move_compensate), use)); } } @@ -558,8 +558,8 @@ static void sp_use_delete_self(SPObject */*deleted*/, SPUse *self) { // always delete uses which are used in flowtext - if (SP_OBJECT_PARENT(self) && SP_IS_FLOWREGION(SP_OBJECT_PARENT(self))) { - SP_OBJECT(self)->deleteObject(); + if (self->parent && SP_IS_FLOWREGION(self->parent)) { + self->deleteObject(); return; } @@ -570,7 +570,7 @@ sp_use_delete_self(SPObject */*deleted*/, SPUse *self) if (mode == SP_CLONE_ORPHANS_UNLINK) { sp_use_unlink(self); } else if (mode == SP_CLONE_ORPHANS_DELETE) { - SP_OBJECT(self)->deleteObject(); + self->deleteObject(); } } @@ -585,12 +585,14 @@ sp_use_update(SPObject *object, SPCtx *ctx, unsigned flags) if (((SPObjectClass *) (parent_class))->update) ((SPObjectClass *) (parent_class))->update(object, ctx, flags); - if (flags & SP_OBJECT_MODIFIED_FLAG) flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; + 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)); + nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), object->style); } } @@ -631,7 +633,7 @@ sp_use_update(SPObject *object, SPCtx *ctx, unsigned flags) /* As last step set additional transform of arena group */ for (SPItemView *v = item->display; v != NULL; v = v->next) { - Geom::Matrix t(Geom::Translate(use->x.computed, use->y.computed)); + Geom::Affine t(Geom::Translate(use->x.computed, use->y.computed)); nr_arena_group_set_child_transform(NR_ARENA_GROUP(v->arenaitem), t); } } @@ -648,7 +650,7 @@ sp_use_modified(SPObject *object, guint flags) 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)); + nr_arena_group_set_style(NR_ARENA_GROUP(v->arenaitem), object->style); } } @@ -668,13 +670,13 @@ SPItem *sp_use_unlink(SPUse *use) return NULL; } - Inkscape::XML::Node *repr = SP_OBJECT_REPR(use); + Inkscape::XML::Node *repr = use->getRepr(); if (!repr) { return NULL; } Inkscape::XML::Node *parent = sp_repr_parent(repr); - SPDocument *document = SP_OBJECT(use)->document; + SPDocument *document = use->document; Inkscape::XML::Document *xml_doc = document->getReprDoc(); // Track the ultimate source of a chain of uses. @@ -684,17 +686,17 @@ SPItem *sp_use_unlink(SPUse *use) } // Calculate the accumulated transform, starting from the original. - Geom::Matrix t = sp_use_get_root_transform(use); + Geom::Affine t = sp_use_get_root_transform(use); Inkscape::XML::Node *copy = NULL; if (SP_IS_SYMBOL(orig)) { // make a group, copy children copy = xml_doc->createElement("svg:g"); - for (Inkscape::XML::Node *child = SP_OBJECT_REPR(orig)->firstChild() ; child != NULL; child = child->next()) { + for (Inkscape::XML::Node *child = orig->getRepr()->firstChild() ; child != NULL; child = child->next()) { Inkscape::XML::Node *newchild = child->duplicate(xml_doc); copy->appendChild(newchild); } } else { // just copy - copy = SP_OBJECT_REPR(orig)->duplicate(xml_doc); + copy = orig->getRepr()->duplicate(xml_doc); } // Add the duplicate repr just after the existing one. @@ -704,20 +706,20 @@ SPItem *sp_use_unlink(SPUse *use) SPObject *unlinked = document->getObjectByRepr(copy); // Merge style from the use. - SPStyle *unli_sty = SP_OBJECT_STYLE(unlinked); - SPStyle const *use_sty = SP_OBJECT_STYLE(use); + SPStyle *unli_sty = unlinked->style; + SPStyle const *use_sty = use->style; sp_style_merge_from_dying_parent(unli_sty, use_sty); sp_style_merge_from_parent(unli_sty, unlinked->parent->style); - SP_OBJECT(unlinked)->updateRepr(); + unlinked->updateRepr(); // Hold onto our SPObject and repr for now. - sp_object_ref(SP_OBJECT(use), NULL); + sp_object_ref(use, NULL); Inkscape::GC::anchor(repr); // Remove ourselves, not propagating delete events to avoid a // chain-reaction with other elements that might reference us. - SP_OBJECT(use)->deleteObject(false); + use->deleteObject(false); // Give the copy our old id and let go of our old repr. copy->setAttribute("id", repr->attribute("id")); @@ -731,15 +733,15 @@ SPItem *sp_use_unlink(SPUse *use) copy->setAttribute("inkscape:tile-cy", NULL); // Establish the succession and let go of our object. - SP_OBJECT(use)->setSuccessor(unlinked); - sp_object_unref(SP_OBJECT(use), NULL); + use->setSuccessor(unlinked); + sp_object_unref(use, NULL); SPItem *item = SP_ITEM(unlinked); // Set the accummulated transform. { - Geom::Matrix nomove(Geom::identity()); + Geom::Affine nomove(Geom::identity()); // Advertise ourselves as not moving. - item->doWriteTransform(SP_OBJECT_REPR(item), t, &nomove); + item->doWriteTransform(item->getRepr(), t, &nomove); } return item; } |
