diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2013-09-19 22:33:11 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2013-09-19 22:33:11 +0000 |
| commit | 4bda89e32e33c7bdff5d3ea3c1ceee1f806de9f7 (patch) | |
| tree | caeb924426bcc861badc6fa81318b67460b26d47 /src/sp-mask.cpp | |
| parent | Update to trunk (diff) | |
| parent | updates for cmake (diff) | |
| download | inkscape-4bda89e32e33c7bdff5d3ea3c1ceee1f806de9f7.tar.gz inkscape-4bda89e32e33c7bdff5d3ea3c1ceee1f806de9f7.zip | |
Update to trunk
(bzr r11950.1.141)
Diffstat (limited to 'src/sp-mask.cpp')
| -rw-r--r-- | src/sp-mask.cpp | 207 |
1 files changed, 91 insertions, 116 deletions
diff --git a/src/sp-mask.cpp b/src/sp-mask.cpp index 4243c9811..9707c9d8e 100644 --- a/src/sp-mask.cpp +++ b/src/sp-mask.cpp @@ -34,129 +34,105 @@ struct SPMaskView { Geom::OptRect bbox; }; -static void sp_mask_build (SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); -static void sp_mask_release (SPObject * object); -static void sp_mask_set (SPObject *object, unsigned int key, const gchar *value); -static void sp_mask_child_added (SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref); -static void sp_mask_update (SPObject *object, SPCtx *ctx, guint flags); -static void sp_mask_modified (SPObject *object, guint flags); -static Inkscape::XML::Node *sp_mask_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); - SPMaskView *sp_mask_view_new_prepend (SPMaskView *list, unsigned int key, Inkscape::DrawingItem *arenaitem); SPMaskView *sp_mask_view_list_remove (SPMaskView *list, SPMaskView *view); -G_DEFINE_TYPE(SPMask, sp_mask, SP_TYPE_OBJECTGROUP); +#include "sp-factory.h" -static void -sp_mask_class_init (SPMaskClass *klass) -{ - SPObjectClass *sp_object_class = (SPObjectClass *) klass; - sp_object_class->build = sp_mask_build; - sp_object_class->release = sp_mask_release; - sp_object_class->set = sp_mask_set; - sp_object_class->child_added = sp_mask_child_added; - sp_object_class->update = sp_mask_update; - sp_object_class->modified = sp_mask_modified; - sp_object_class->write = sp_mask_write; +namespace { + SPObject* createMask() { + return new SPMask(); + } + + bool maskRegistered = SPFactory::instance().registerObject("svg:mask", createMask); } -static void -sp_mask_init (SPMask *mask) -{ - mask->maskUnits_set = FALSE; - mask->maskUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; +SPMask::SPMask() : SPObjectGroup() { + this->maskUnits_set = FALSE; + this->maskUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; - mask->maskContentUnits_set = FALSE; - mask->maskContentUnits = SP_CONTENT_UNITS_USERSPACEONUSE; + this->maskContentUnits_set = FALSE; + this->maskContentUnits = SP_CONTENT_UNITS_USERSPACEONUSE; - mask->display = NULL; + this->display = NULL; } -static void -sp_mask_build (SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) -{ - if (((SPObjectClass *) sp_mask_parent_class)->build) { - ((SPObjectClass *) sp_mask_parent_class)->build (object, document, repr); - } +SPMask::~SPMask() { +} - object->readAttr( "maskUnits" ); - object->readAttr( "maskContentUnits" ); +void SPMask::build(SPDocument* doc, Inkscape::XML::Node* repr) { + SPObjectGroup::build(doc, repr); + + this->readAttr( "maskUnits" ); + this->readAttr( "maskContentUnits" ); /* Register ourselves */ - document->addResource("mask", object); + doc->addResource("mask", this); } -static void sp_mask_release (SPObject * object) -{ - if (object->document) { +void SPMask::release() { + if (this->document) { // Unregister ourselves - object->document->removeResource("mask", object); + this->document->removeResource("mask", this); } - SPMask *cp = SP_MASK (object); - while (cp->display) { + while (this->display) { // We simply unref and let item manage this in handler - cp->display = sp_mask_view_list_remove (cp->display, cp->display); + this->display = sp_mask_view_list_remove(this->display, this->display); } - if (((SPObjectClass *) (sp_mask_parent_class))->release) { - ((SPObjectClass *) sp_mask_parent_class)->release (object); - } + SPObjectGroup::release(); } -static void -sp_mask_set (SPObject *object, unsigned int key, const gchar *value) -{ - SPMask *mask = SP_MASK (object); - +void SPMask::set(unsigned int key, const gchar* value) { switch (key) { case SP_ATTR_MASKUNITS: - mask->maskUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; - mask->maskUnits_set = FALSE; + this->maskUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; + this->maskUnits_set = FALSE; + if (value) { if (!strcmp (value, "userSpaceOnUse")) { - mask->maskUnits = SP_CONTENT_UNITS_USERSPACEONUSE; - mask->maskUnits_set = TRUE; + this->maskUnits = SP_CONTENT_UNITS_USERSPACEONUSE; + this->maskUnits_set = TRUE; } else if (!strcmp (value, "objectBoundingBox")) { - mask->maskUnits_set = TRUE; + this->maskUnits_set = TRUE; } } - object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_MASKCONTENTUNITS: - mask->maskContentUnits = SP_CONTENT_UNITS_USERSPACEONUSE; - mask->maskContentUnits_set = FALSE; + this->maskContentUnits = SP_CONTENT_UNITS_USERSPACEONUSE; + this->maskContentUnits_set = FALSE; + if (value) { if (!strcmp (value, "userSpaceOnUse")) { - mask->maskContentUnits_set = TRUE; + this->maskContentUnits_set = TRUE; } else if (!strcmp (value, "objectBoundingBox")) { - mask->maskContentUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; - mask->maskContentUnits_set = TRUE; + this->maskContentUnits = SP_CONTENT_UNITS_OBJECTBOUNDINGBOX; + this->maskContentUnits_set = TRUE; } } - object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); + + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); break; default: - if (((SPObjectClass *) sp_mask_parent_class)->set) - ((SPObjectClass *) sp_mask_parent_class)->set (object, key, value); + SPObjectGroup::set(key, value); break; } } -static void -sp_mask_child_added (SPObject *object, Inkscape::XML::Node *child, Inkscape::XML::Node *ref) -{ +void SPMask::child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref) { /* Invoke SPObjectGroup implementation */ - ((SPObjectClass *) (sp_mask_parent_class))->child_added (object, child, ref); + SPObjectGroup::child_added(child, ref); /* Show new object */ - SPObject *ochild = object->document->getObjectByRepr(child); + SPObject *ochild = this->document->getObjectByRepr(child); + if (SP_IS_ITEM (ochild)) { - SPMask *cp = SP_MASK (object); - for (SPMaskView *v = cp->display; v != NULL; v = v->next) { - Inkscape::DrawingItem *ac = SP_ITEM (ochild)->invoke_show ( v->arenaitem->drawing(), - v->key, - SP_ITEM_REFERENCE_FLAGS); + for (SPMaskView *v = this->display; v != NULL; v = v->next) { + Inkscape::DrawingItem *ac = SP_ITEM (ochild)->invoke_show(v->arenaitem->drawing(), v->key, SP_ITEM_REFERENCE_FLAGS); + if (ac) { v->arenaitem->prependChild(ac); } @@ -164,34 +140,37 @@ sp_mask_child_added (SPObject *object, Inkscape::XML::Node *child, Inkscape::XML } } -static void sp_mask_update(SPObject *object, SPCtx *ctx, guint flags) -{ + +void SPMask::update(SPCtx* ctx, unsigned int flags) { if (flags & SP_OBJECT_MODIFIED_FLAG) { flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; } flags &= SP_OBJECT_MODIFIED_CASCADE; - SPObjectGroup *og = SP_OBJECTGROUP(object); GSList *l = NULL; - for (SPObject *child = og->firstChild(); child; child = child->getNext()) { - g_object_ref(G_OBJECT (child)); + for (SPObject *child = this->firstChild(); child; child = child->getNext()) { + sp_object_ref(child); l = g_slist_prepend (l, child); } + l = g_slist_reverse (l); + while (l) { SPObject *child = SP_OBJECT(l->data); l = g_slist_remove(l, child); + if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->updateDisplay(ctx, flags); } - g_object_unref(G_OBJECT(child)); + + sp_object_unref(child); } - SPMask *mask = SP_MASK(object); - for (SPMaskView *v = mask->display; v != NULL; v = v->next) { + for (SPMaskView *v = this->display; v != NULL; v = v->next) { Inkscape::DrawingGroup *g = dynamic_cast<Inkscape::DrawingGroup *>(v->arenaitem); - if (mask->maskContentUnits == SP_CONTENT_UNITS_OBJECTBOUNDINGBOX && v->bbox) { + + if (this->maskContentUnits == SP_CONTENT_UNITS_OBJECTBOUNDINGBOX && v->bbox) { Geom::Affine t = Geom::Scale(v->bbox->dimensions()); t.setTranslation(v->bbox->min()); g->setChildTransform(t); @@ -201,40 +180,39 @@ static void sp_mask_update(SPObject *object, SPCtx *ctx, guint flags) } } -static void sp_mask_modified(SPObject *object, guint flags) -{ +void SPMask::modified(unsigned int flags) { if (flags & SP_OBJECT_MODIFIED_FLAG) { flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; } flags &= SP_OBJECT_MODIFIED_CASCADE; - SPObjectGroup *og = SP_OBJECTGROUP(object); GSList *l = NULL; - for (SPObject *child = og->firstChild(); child; child = child->getNext()) { - g_object_ref(G_OBJECT(child)); + for (SPObject *child = this->firstChild(); child; child = child->getNext()) { + sp_object_ref(child); l = g_slist_prepend(l, child); } + l = g_slist_reverse(l); + while (l) { SPObject *child = SP_OBJECT(l->data); l = g_slist_remove(l, child); + if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { child->emitModified(flags); } - g_object_unref(G_OBJECT(child)); + + sp_object_unref(child); } } -static Inkscape::XML::Node * -sp_mask_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) -{ +Inkscape::XML::Node* SPMask::write(Inkscape::XML::Document* xml_doc, Inkscape::XML::Node* repr, guint flags) { if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { repr = xml_doc->createElement("svg:mask"); } - if (((SPObjectClass *) (sp_mask_parent_class))->write) - ((SPObjectClass *) (sp_mask_parent_class))->write (object, xml_doc, repr, flags); + SPObjectGroup::write(xml_doc, repr, flags); return repr; } @@ -271,47 +249,46 @@ sp_mask_create (GSList *reprs, SPDocument *document, Geom::Affine const* applyTr return mask_id; } -Inkscape::DrawingItem *sp_mask_show(SPMask *mask, Inkscape::Drawing &drawing, unsigned int key) -{ - g_return_val_if_fail (mask != NULL, NULL); - g_return_val_if_fail (SP_IS_MASK (mask), NULL); +Inkscape::DrawingItem *SPMask::sp_mask_show(Inkscape::Drawing &drawing, unsigned int key) { + g_return_val_if_fail (this != NULL, NULL); + g_return_val_if_fail (SP_IS_MASK (this), NULL); Inkscape::DrawingGroup *ai = new Inkscape::DrawingGroup(drawing); - mask->display = sp_mask_view_new_prepend (mask->display, key, ai); + this->display = sp_mask_view_new_prepend (this->display, key, ai); - for ( SPObject *child = mask->firstChild() ; child; child = child->getNext() ) { + for ( SPObject *child = this->firstChild() ; child; child = child->getNext() ) { if (SP_IS_ITEM (child)) { Inkscape::DrawingItem *ac = SP_ITEM (child)->invoke_show (drawing, key, SP_ITEM_REFERENCE_FLAGS); + if (ac) { ai->prependChild(ac); } } } - if (mask->maskContentUnits == SP_CONTENT_UNITS_OBJECTBOUNDINGBOX && mask->display->bbox) { - Geom::Affine t = Geom::Scale(mask->display->bbox->dimensions()); - t.setTranslation(mask->display->bbox->min()); + if (this->maskContentUnits == SP_CONTENT_UNITS_OBJECTBOUNDINGBOX && this->display->bbox) { + Geom::Affine t = Geom::Scale(this->display->bbox->dimensions()); + t.setTranslation(this->display->bbox->min()); ai->setChildTransform(t); } return ai; } -void sp_mask_hide(SPMask *cp, unsigned int key) -{ - g_return_if_fail (cp != NULL); - g_return_if_fail (SP_IS_MASK (cp)); +void SPMask::sp_mask_hide(unsigned int key) { + g_return_if_fail (this != NULL); + g_return_if_fail (SP_IS_MASK (this)); - for ( SPObject *child = cp->firstChild(); child; child = child->getNext()) { + for ( SPObject *child = this->firstChild(); child; child = child->getNext()) { if (SP_IS_ITEM (child)) { SP_ITEM(child)->invoke_hide (key); } } - for (SPMaskView *v = cp->display; v != NULL; v = v->next) { + for (SPMaskView *v = this->display; v != NULL; v = v->next) { if (v->key == key) { /* We simply unref and let item to manage this in handler */ - cp->display = sp_mask_view_list_remove (cp->display, v); + this->display = sp_mask_view_list_remove (this->display, v); return; } } @@ -319,10 +296,8 @@ void sp_mask_hide(SPMask *cp, unsigned int key) g_assert_not_reached (); } -void -sp_mask_set_bbox (SPMask *mask, unsigned int key, Geom::OptRect const &bbox) -{ - for (SPMaskView *v = mask->display; v != NULL; v = v->next) { +void SPMask::sp_mask_set_bbox(unsigned int key, Geom::OptRect const &bbox) { + for (SPMaskView *v = this->display; v != NULL; v = v->next) { if (v->key == key) { v->bbox = bbox; break; |
