X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-use.cpp;h=505c64fd225b326e448dca557ad9e1fb31b4c525;hb=HEAD;hp=12066f925636db48eaead4199ea447b98012f742;hpb=90a3966dd44e306d23febc15ebd65cde07d7a4dd;p=inkscape.git diff --git a/src/sp-use.cpp b/src/sp-use.cpp index 12066f925..505c64fd2 100644 --- a/src/sp-use.cpp +++ b/src/sp-use.cpp @@ -1,11 +1,11 @@ -#define __SP_USE_C__ - /* * SVG implementation * * Authors: * Lauris Kaplinski * bulia byak + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 1999-2005 authors * Copyright (C) 2000-2001 Ximian, Inc. @@ -32,7 +32,7 @@ #include "uri.h" #include "print.h" #include "xml/repr.h" -#include "prefs-utils.h" +#include "preferences.h" #include "style.h" #include "sp-symbol.h" #include "sp-use.h" @@ -52,7 +52,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, Geom::Matrix const &transform, unsigned const flags); -static void sp_use_snappoints(SPItem const *item, SnapPointsIter p); +static void sp_use_snappoints(SPItem const *item, std::vector &p, Inkscape::SnapPreferences const *snapprefs); 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); @@ -64,7 +64,7 @@ static void sp_use_delete_self(SPObject *deleted, SPUse *self); static SPItemClass *parent_class; -//void m_print(gchar *say, NR::Matrix m) +//void m_print(gchar *say, Geom::Matrix 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 @@ -140,7 +140,7 @@ sp_use_finalize(GObject *obj) SPUse *use = (SPUse *) obj; if (use->child) { - sp_object_detach(SP_OBJECT(obj), use->child); + SP_OBJECT(obj)->detach(use->child); use->child = NULL; } @@ -160,11 +160,11 @@ sp_use_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) (* ((SPObjectClass *) parent_class)->build)(object, document, repr); } - sp_object_read_attr(object, "x"); - sp_object_read_attr(object, "y"); - sp_object_read_attr(object, "width"); - sp_object_read_attr(object, "height"); - sp_object_read_attr(object, "xlink:href"); + object->readAttr( "x" ); + object->readAttr( "y" ); + object->readAttr( "width" ); + object->readAttr( "height" ); + object->readAttr( "xlink:href" ); // We don't need to create child here: // reading xlink:href will attach ref, and that will cause the changed signal to be emitted, @@ -177,7 +177,7 @@ sp_use_release(SPObject *object) SPUse *use = SP_USE(object); if (use->child) { - sp_object_detach(object, use->child); + object->detach(use->child); use->child = NULL; } @@ -288,7 +288,14 @@ sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Matrix const &transform, uns * Geom::Translate(use->x.computed, use->y.computed) * transform ); - sp_item_invoke_bbox_full(child, bbox, ct, flags, FALSE); + Geom::OptRect optbbox; + child->invoke_bbox_full( optbbox, ct, flags, FALSE); + if (optbbox) { + bbox->x0 = (*optbbox)[0][0]; + bbox->y0 = (*optbbox)[1][0]; + bbox->x1 = (*optbbox)[0][1]; + bbox->y1 = (*optbbox)[1][1]; + } } } @@ -299,13 +306,13 @@ 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)) { - NR::Matrix tp(Geom::Translate(use->x.computed, use->y.computed)); + Geom::Matrix tp(Geom::Translate(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); + SP_ITEM(use->child)->invoke_print(ctx); } if (translated) { @@ -329,7 +336,7 @@ sp_use_description(SPItem *item) * a , and giving its description. */ } ++recursion_depth; - char *child_desc = sp_item_description(SP_ITEM(use->child)); + char *child_desc = SP_ITEM(use->child)->description(); --recursion_depth; ret = g_strdup_printf(_("Clone of: %s"), child_desc); @@ -350,13 +357,13 @@ sp_use_show(SPItem *item, NRArena *arena, unsigned key, unsigned flags) 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); + NRArenaItem *ac = SP_ITEM(use->child)->invoke_show(arena, key, flags); if (ac) { nr_arena_item_add_child(ai, ac, NULL); } Geom::Translate t(use->x.computed, use->y.computed); - nr_arena_group_set_child_transform(NR_ARENA_GROUP(ai), NR::Matrix(t)); + nr_arena_group_set_child_transform(NR_ARENA_GROUP(ai), Geom::Matrix(t)); } return ai; @@ -368,7 +375,7 @@ sp_use_hide(SPItem *item, unsigned key) SPUse *use = SP_USE(item); if (use->child) { - sp_item_invoke_hide(SP_ITEM(use->child), key); + SP_ITEM(use->child)->invoke_hide(key); } if (((SPItemClass *) parent_class)->hide) { @@ -388,10 +395,11 @@ SPItem * sp_use_root(SPUse *use) { SPObject *orig = use->child; - while (SP_IS_USE(orig)) { + while (orig && SP_IS_USE(orig)) { orig = SP_USE(orig)->child; } - g_return_val_if_fail(SP_IS_ITEM(orig), NULL); + if (!orig || !SP_IS_ITEM(orig)) + return NULL; return SP_ITEM(orig); } @@ -399,7 +407,7 @@ sp_use_root(SPUse *use) * Returns the effective transform that goes from the ultimate original to given SPUse, both ends * included. */ -NR::Matrix +Geom::Matrix sp_use_get_root_transform(SPUse *use) { //track the ultimate source of a chain of uses @@ -414,7 +422,7 @@ sp_use_get_root_transform(SPUse *use) //calculate the accummulated transform, starting from the original - NR::Matrix t(NR::identity()); + Geom::Matrix t(Geom::identity()); for (GSList *i = chain; i != NULL; i = i->next) { SPItem *i_tem = SP_ITEM(i->data); @@ -439,7 +447,7 @@ 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. */ -NR::Matrix +Geom::Matrix sp_use_get_parent_transform(SPUse *use) { Geom::Matrix t(Geom::identity()); @@ -471,7 +479,8 @@ sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self return; } - guint mode = prefs_get_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_PARALLEL); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + guint mode = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_PARALLEL); // user wants no compensation if (mode == SP_CLONE_COMPENSATION_NONE) return; @@ -483,7 +492,7 @@ sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self return; // restore item->transform field from the repr, in case it was changed by seltrans - sp_object_read_attr (SP_OBJECT (self), "transform"); + SP_OBJECT (self)->readAttr ("transform"); Geom::Matrix t = sp_use_get_parent_transform(self); Geom::Matrix clone_move = t.inverse() * m * t; @@ -503,7 +512,7 @@ sp_use_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPUse *self // commit the compensation SPItem *item = SP_ITEM(self); item->transform *= clone_move; - sp_item_write_transform(item, SP_OBJECT_REPR(item), item->transform, &advertized_move); + item->doWriteTransform(SP_OBJECT_REPR(item), item->transform, &advertized_move); SP_OBJECT(item)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); } @@ -516,7 +525,7 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) use->_transformed_connection.disconnect(); if (use->child) { - sp_object_detach(SP_OBJECT(use), use->child); + SP_OBJECT(use)->detach(use->child); use->child = NULL; } @@ -528,13 +537,13 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) 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_attach(SP_OBJECT(use), use->child, use->lastChild()); + SP_OBJECT(use)->attach(use->child, use->lastChild()); sp_object_unref(use->child, SP_OBJECT(use)); - sp_object_invoke_build(use->child, SP_OBJECT(use)->document, childrepr, TRUE); + (use->child)->invoke_build(SP_OBJECT(use)->document, childrepr, TRUE); for (SPItemView *v = item->display; v != NULL; v = v->next) { NRArenaItem *ai; - ai = sp_item_invoke_show(SP_ITEM(use->child), NR_ARENA_ITEM_ARENA(v->arenaitem), v->key, v->flags); + ai = SP_ITEM(use->child)->invoke_show(NR_ARENA_ITEM_ARENA(v->arenaitem), v->key, v->flags); if (ai) { nr_arena_item_add_child(v->arenaitem, ai, NULL); } @@ -556,7 +565,8 @@ sp_use_delete_self(SPObject */*deleted*/, SPUse *self) return; } - guint const mode = prefs_get_int_attribute("options.cloneorphans", "value", + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + guint const mode = prefs->getInt("/options/cloneorphans/value", SP_CLONE_ORPHANS_UNLINK); if (mode == SP_CLONE_ORPHANS_UNLINK) { @@ -603,7 +613,7 @@ sp_use_update(SPObject *object, SPCtx *ctx, unsigned flags) cctx.vp.y0 = 0.0; cctx.vp.x1 = use->width.computed; cctx.vp.y1 = use->height.computed; - cctx.i2vp = NR::identity(); + cctx.i2vp = Geom::identity(); flags&=~SP_OBJECT_USER_MODIFIED_FLAG_B; if (use->child) { @@ -623,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) { - NR::Matrix t(Geom::Translate(use->x.computed, use->y.computed)); + Geom::Matrix t(Geom::Translate(use->x.computed, use->y.computed)); nr_arena_group_set_child_transform(NR_ARENA_GROUP(v->arenaitem), t); } } @@ -654,21 +664,26 @@ sp_use_modified(SPObject *object, guint flags) } } -SPItem * -sp_use_unlink(SPUse *use) +SPItem *sp_use_unlink(SPUse *use) { - if (!use) return NULL; + if (!use) { + return NULL; + } Inkscape::XML::Node *repr = SP_OBJECT_REPR(use); - if (!repr) return NULL; + if (!repr) { + return NULL; + } Inkscape::XML::Node *parent = sp_repr_parent(repr); SPDocument *document = SP_OBJECT(use)->document; - Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document); + Inkscape::XML::Document *xml_doc = document->getReprDoc(); // Track the ultimate source of a chain of uses. SPItem *orig = sp_use_root(use); - g_return_val_if_fail(orig, NULL); + if (!orig) { + return NULL; + } // Calculate the accumulated transform, starting from the original. Geom::Matrix t = sp_use_get_root_transform(use); @@ -726,7 +741,7 @@ sp_use_unlink(SPUse *use) { Geom::Matrix nomove(Geom::identity()); // Advertise ourselves as not moving. - sp_item_write_transform(item, SP_OBJECT_REPR(item), t, &nomove); + item->doWriteTransform(SP_OBJECT_REPR(item), t, &nomove); } return item; } @@ -739,19 +754,20 @@ sp_use_get_original(SPUse *use) } static void -sp_use_snappoints(SPItem const *item, SnapPointsIter p) +sp_use_snappoints(SPItem const *item, std::vector &p, Inkscape::SnapPreferences const *snapprefs) { 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); - g_return_if_fail(root); - + if (!root) + return; + SPItemClass const &item_class = *(SPItemClass const *) G_OBJECT_GET_CLASS(root); if (item_class.snappoints) { - item_class.snappoints(root, p); + item_class.snappoints(root, p, snapprefs); } }