Code

implement rendering of clips/masks in outline mode; make all outline colors stored...
[inkscape.git] / src / sp-pattern.cpp
index beea89b02ced8f5c62ace242fde0f9d03ef8ab5f..89eeacec4f5d008679b3c8a356ddae8e2d71576a 100644 (file)
@@ -27,6 +27,9 @@
 #include "sp-pattern.h"
 #include "xml/repr.h"
 
+#include <sigc++/functors/ptr_fun.h>
+#include <sigc++/adaptors/bind.h>
+
 /*
  * Pattern
  */
@@ -137,6 +140,8 @@ sp_pattern_init (SPPattern *pat)
        pat->height.unset();
 
        pat->viewBox_set = FALSE;
+
+       new (&pat->modified_connection) sigc::connection();
 }
 
 static void
@@ -172,13 +177,14 @@ sp_pattern_release (SPObject *object)
        }
 
        if (pat->ref) {
-               if (pat->ref->getObject())
-                       sp_signal_disconnect_by_data(pat->ref->getObject(), pat);
+               pat->modified_connection.disconnect();
                pat->ref->detach();
                delete pat->ref;
                pat->ref = NULL;
        }
 
+       pat->modified_connection.~connection();
+
        if (((SPObjectClass *) pattern_parent_class)->release)
                ((SPObjectClass *) pattern_parent_class)->release (object);
 }
@@ -332,7 +338,7 @@ sp_pattern_child_added (SPObject *object, Inkscape::XML::Node *child, Inkscape::
 }
 
 /* TODO: do we need a ::remove_child handler? */
+
 /* fixme: We need ::order_changed handler too (Lauris) */
 
 GSList *
@@ -403,10 +409,10 @@ static void
 pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat)
 {
        if (old_ref) {
-               sp_signal_disconnect_by_data(old_ref, pat);
+               pat->modified_connection.disconnect();
        }
        if (SP_IS_PATTERN (ref)) {
-               g_signal_connect(G_OBJECT (ref), "modified", G_CALLBACK (pattern_ref_modified), pat);
+               pat->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&pattern_ref_modified), pat));
        }
 
        pattern_ref_modified (ref, 0, pat);
@@ -458,7 +464,7 @@ sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const gchar *pr
                SPCSSAttr *css = sp_repr_css_attr_new ();
                sp_repr_css_set_property (css, property, href);
                sp_repr_css_change_recursive (SP_OBJECT_REPR (item), css, "style");
-       } 
+       }
        return pattern;
 }
 
@@ -512,7 +518,7 @@ pattern_tile (GSList *reprs, NR::Rect bounds, SPDocument *document, NR::Matrix t
                SPItem *copy = SP_ITEM(pat_object->appendChildRepr(node));
 
                NR::Matrix dup_transform;
-               if (!sp_svg_transform_read (node->attribute("transform"), &dup_transform)) 
+               if (!sp_svg_transform_read (node->attribute("transform"), &dup_transform))
                        dup_transform = NR::identity();
                dup_transform *= move;
 
@@ -524,7 +530,7 @@ pattern_tile (GSList *reprs, NR::Rect bounds, SPDocument *document, NR::Matrix t
 }
 
 SPPattern *
-pattern_getroot (SPPattern *pat) 
+pattern_getroot (SPPattern *pat)
 {
        for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
                if (sp_object_first_child(SP_OBJECT(pat_i))) { // find the first one with children
@@ -708,7 +714,7 @@ sp_pattern_painter_new (SPPaintServer *ps, NR::Matrix const &full_transform, NR:
                        pcs2px = pattern_patternTransform(pat) * full_transform;
                }
 
-               pcs2px = NR::translate (pattern_x (pat), pattern_y (pat)) * pcs2px; 
+               pcs2px = NR::translate (pattern_x (pat), pattern_y (pat)) * pcs2px;
 
                pcs2px.copyto (&pp->pcs2px);
        }
@@ -964,10 +970,10 @@ sp_pat_fill (SPPainter *painter, NRPixBlock *pb)
                                area.x1 = area.x0 + pb->area.x1 - pb->area.x0;
                                area.y1 = area.y0 + pb->area.y1 - pb->area.y0;
                                
-                               // We do not update here anymore 
+                               // We do not update here anymore
 
-                               // Set up buffer 
-                               // fixme: (Lauris) 
+                               // Set up buffer
+                               // fixme: (Lauris)
                                nr_pixblock_setup_extern (&ppb, pb->mode, area.x0, area.y0, area.x1, area.y1, NR_PIXBLOCK_PX (pb), pb->rs, FALSE, FALSE);
                                
                                nr_arena_item_invoke_render (pp->root, &area, &ppb, 0);