Code

Fork gradientvector upon deletion of stops.
[inkscape.git] / src / gradient-chemistry.cpp
index 0da9896e1f3f0f96b034577e9f1b38095ae359e9..78ea135076387886839cdaaea2c3a9f2f54e430d 100644 (file)
@@ -6,7 +6,9 @@
  * Authors:
  *   Lauris Kaplinski <lauris@kaplinski.com>
  *   bulia byak
+ *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
  *
+ * Copyright (C) 2007 Johan Engelen
  * Copyright (C) 2001-2005 authors
  * Copyright (C) 2001 Ximian, Inc.
  *
@@ -93,12 +95,13 @@ sp_gradient_get_private_normalized(SPDocument *document, SPGradient *vector, SPG
 
     SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document);
 
+    Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
     // create a new private gradient of the requested type
     Inkscape::XML::Node *repr;
     if (type == SP_GRADIENT_TYPE_LINEAR) {
-        repr = sp_repr_new("svg:linearGradient");
+        repr = xml_doc->createElement("svg:linearGradient");
     } else {
-        repr = sp_repr_new("svg:radialGradient");
+        repr = xml_doc->createElement("svg:radialGradient");
     }
 
     // privates are garbage-collectable
@@ -621,13 +624,11 @@ sp_item_gradient_stop_set_style (SPItem *item, guint point_type, guint point_i,
 
     if (!vector) // orphan!
         return;
-    
-    /*
-    vector = sp_gradient_fork_vector_if_necessary (vector);   // TESTJOHAN
+
+    vector = sp_gradient_fork_vector_if_necessary (vector);
     if ( gradient != vector && gradient->ref->getObject() != vector ) {
         sp_gradient_repr_set_link(SP_OBJECT_REPR(gradient), vector);
     }
-    */
 
     switch (point_type) {
         case POINT_LG_BEGIN:
@@ -1135,8 +1136,9 @@ SPGradient *
 sp_document_default_gradient_vector(SPDocument *document, guint32 color)
 {
     SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document);
+    Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
 
-    Inkscape::XML::Node *repr = sp_repr_new("svg:linearGradient");
+    Inkscape::XML::Node *repr = xml_doc->createElement("svg:linearGradient");
 
     repr->setAttribute("inkscape:collect", "always");
     // set here, but removed when it's edited in the gradient editor
@@ -1144,7 +1146,7 @@ sp_document_default_gradient_vector(SPDocument *document, guint32 color)
     // (1) here, search gradients by color and return what is found without duplication
     // (2) in fill & stroke, show only one copy of each gradient in list
 
-    Inkscape::XML::Node *stop = sp_repr_new("svg:stop");
+    Inkscape::XML::Node *stop = xml_doc->createElement("svg:stop");
 
     gchar b[64];
     sp_svg_write_color(b, 64, color);
@@ -1160,7 +1162,7 @@ sp_document_default_gradient_vector(SPDocument *document, guint32 color)
     repr->appendChild(stop);
     Inkscape::GC::release(stop);
 
-    stop = sp_repr_new("svg:stop");
+    stop = xml_doc->createElement("svg:stop");
 
     {
         gchar *t = g_strdup_printf("stop-color:%s;stop-opacity:0;", b);
@@ -1222,6 +1224,18 @@ sp_gradient_vector_for_object(SPDocument *const doc, SPDesktop *const desktop,
     return sp_document_default_gradient_vector(doc, rgba);
 }
 
+
+SPGradient *
+sp_gradient_get_forked_vector_if_necessary(SPGradient *gradient, bool force_vector)
+{
+    SPGradient *vector = sp_gradient_get_vector (gradient, force_vector);
+    vector = sp_gradient_fork_vector_if_necessary (vector);
+    if ( gradient != vector && gradient->ref->getObject() != vector ) {
+        sp_gradient_repr_set_link(SP_OBJECT_REPR(gradient), vector);
+    }
+    return vector;
+}
+
 /*
   Local Variables:
   mode:c++