summaryrefslogtreecommitdiffstats
path: root/src/sp-use.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp-use.cpp')
-rw-r--r--src/sp-use.cpp108
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;
}