diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index beea89b02ced8f5c62ace242fde0f9d03ef8ab5f..4a919afa669cf6d1cf8dca485aa06cd75ecec7d2 100644 (file)
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
#include "sp-pattern.h"
#include "xml/repr.h"
+#include <sigc++/functors/ptr_fun.h>
+#include <sigc++/adaptors/bind.h>
+
/*
* Pattern
*/
pat->height.unset();
pat->viewBox_set = FALSE;
+
+ new (&pat->modified_connection) sigc::connection();
}
static void
}
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 *
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);
pattern_chain (SPPattern *pattern)
{
SPDocument *document = SP_OBJECT_DOCUMENT (pattern);
+ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
Inkscape::XML::Node *defsrepr = SP_OBJECT_REPR (SP_DOCUMENT_DEFS (document));
- Inkscape::XML::Node *repr = sp_repr_new ("svg:pattern");
+ Inkscape::XML::Node *repr = xml_doc->createElement("svg:pattern");
repr->setAttribute("inkscape:collect", "always");
gchar *parent_ref = g_strconcat ("#", SP_OBJECT_REPR(pattern)->attribute("id"), NULL);
repr->setAttribute("xlink:href", parent_ref);
@@ -458,7 +465,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;
}
@@ -477,31 +484,25 @@ sp_pattern_transform_multiply (SPPattern *pattern, NR::Matrix postmul, bool set)
}
pattern->patternTransform_set = TRUE;
- gchar c[256];
- if (sp_svg_transform_write(c, 256, pattern->patternTransform)) {
- SP_OBJECT_REPR(pattern)->setAttribute("patternTransform", c);
- } else {
- SP_OBJECT_REPR(pattern)->setAttribute("patternTransform", NULL);
- }
+ gchar *c=sp_svg_transform_write(pattern->patternTransform);
+ SP_OBJECT_REPR(pattern)->setAttribute("patternTransform", c);
+ g_free(c);
}
const gchar *
pattern_tile (GSList *reprs, NR::Rect bounds, SPDocument *document, NR::Matrix transform, NR::Matrix move)
{
+ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
Inkscape::XML::Node *defsrepr = SP_OBJECT_REPR (SP_DOCUMENT_DEFS (document));
- Inkscape::XML::Node *repr = sp_repr_new ("svg:pattern");
+ Inkscape::XML::Node *repr = xml_doc->createElement("svg:pattern");
repr->setAttribute("patternUnits", "userSpaceOnUse");
sp_repr_set_svg_double(repr, "width", bounds.extent(NR::X));
sp_repr_set_svg_double(repr, "height", bounds.extent(NR::Y));
- gchar t[256];
- if (sp_svg_transform_write(t, 256, transform)) {
- repr->setAttribute("patternTransform", t);
- } else {
- repr->setAttribute("patternTransform", NULL);
- }
-
+ gchar *t=sp_svg_transform_write(transform);
+ repr->setAttribute("patternTransform", t);
+ g_free(t);
defsrepr->appendChild(repr);
const gchar *pat_id = repr->attribute("id");
@@ -512,7 +513,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 +525,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
// Access functions that look up fields up the chain of referenced patterns and return the first one which is set
+// FIXME: all of them must use chase_hrefs the same as in SPGradient, to avoid lockup on circular refs
guint pattern_patternUnits (SPPattern *pat)
{
@@ -708,7 +710,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);
}
@@ -783,7 +785,7 @@ sp_pattern_painter_new (SPPaintServer *ps, NR::Matrix const &full_transform, NR:
}
nr_arena_item_invoke_update (pp->root, NULL, &gc, NR_ARENA_ITEM_STATE_ALL, NR_ARENA_ITEM_STATE_ALL);
if ( pp->use_cached_tile ) {
- nr_arena_item_invoke_render (pp->root, &pp->cached_bbox, &pp->cached_tile, 0);
+ nr_arena_item_invoke_render (NULL, pp->root, &pp->cached_bbox, &pp->cached_tile, 0);
} else {
// nothing to do now
}
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);
+ nr_arena_item_invoke_render (NULL, pp->root, &area, &ppb, 0);
nr_pixblock_release (&ppb);
}