Code

Switched pen and pencil toobars to stock GTK+ toolbars
[inkscape.git] / src / sp-pattern.cpp
index 89eeacec4f5d008679b3c8a356ddae8e2d71576a..4a919afa669cf6d1cf8dca485aa06cd75ecec7d2 100644 (file)
@@ -438,9 +438,10 @@ SPPattern *
 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);
@@ -483,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");
@@ -543,6 +538,7 @@ pattern_getroot (SPPattern *pat)
 
 
 // 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)
 {
@@ -789,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
        }
@@ -976,7 +972,7 @@ sp_pat_fill (SPPainter *painter, NRPixBlock *pb)
                                // 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);
                        }