Code

Fixes to unmasking:
authorknutux <knutux@users.sourceforge.net>
Tue, 21 Mar 2006 07:22:28 +0000 (07:22 +0000)
committerknutux <knutux@users.sourceforge.net>
Tue, 21 Mar 2006 07:22:28 +0000 (07:22 +0000)
- Fixed crash if unmask/unclip is used on unmasked object
- Restoring mask/clippath object even if it is still referenced
- Adding restored mask objects to selected item list

src/selection-chemistry.cpp

index 91686d277f6c7751fef4629f500893d91b58bce4..ba0d89850fd4bc475d80e014cb04ccac6477de26 100644 (file)
@@ -2385,8 +2385,9 @@ void sp_selection_unset_mask(bool apply_clip_path) {
             } else {
                 uri_ref = item->mask_ref;
             }
-    
-            if (NULL != uri_ref && referenced_objects.end() == referenced_objects.find(uri_ref->getObject())) {
+
+            // collect distinct mask object
+            if (NULL != uri_ref && NULL != uri_ref->getObject() && referenced_objects.end() == referenced_objects.find(uri_ref->getObject())) {
                 referenced_objects.insert(uri_ref->getObject());
             }
         }
@@ -2394,23 +2395,26 @@ void sp_selection_unset_mask(bool apply_clip_path) {
         SP_OBJECT_REPR(i->data)->setAttribute(attributeName, "none");
     }
 
+    // restore mask objects into a document
     for ( std::set<SPObject*>::iterator it = referenced_objects.begin() ; it != referenced_objects.end() ; ++it) {
         SPObject *obj = (*it);
+        GSList *items_to_move = NULL;
+        for (SPObject *child = sp_object_first_child(obj) ; child != NULL; child = SP_OBJECT_NEXT(child) ) {
+            Inkscape::XML::Node *copy = SP_OBJECT_REPR(child)->duplicate();
+            items_to_move = g_slist_prepend (items_to_move, copy);
+        }
+
         if (!obj->isReferenced()) {
-            GSList *items_to_move = NULL;
-            for (SPObject *child = sp_object_first_child(obj) ; child != NULL; child = SP_OBJECT_NEXT(child) ) {
-                Inkscape::XML::Node *copy = SP_OBJECT_REPR(child)->duplicate();
-                items_to_move = g_slist_prepend (items_to_move, copy);
-            }
-            
+            // delete from defs if no other object references this mask
             obj->deleteObject(false);
+        }
 
-            for (GSList *i = items_to_move; NULL != i; i = i->next) {
-                desktop->currentLayer()->appendChildRepr((Inkscape::XML::Node *)i->data);
-            }
-
-            g_slist_free (items_to_move);
+        for (GSList *i = items_to_move; NULL != i; i = i->next) {
+            desktop->currentLayer()->appendChildRepr((Inkscape::XML::Node *)i->data);
+            selection->add((Inkscape::XML::Node *)i->data);
         }
+
+        g_slist_free (items_to_move);
     }
 
     sp_document_done (document);