Code

Make curvature work again by fixing a minor omission
[inkscape.git] / src / sp-star.cpp
index 88b24aa77aa842a137f40bffe5507536ceaade73..9cffd952ca2c72bb2ea91ec0b26ebdc4a9eb1933 100644 (file)
 #include "xml/repr.h"
 #include "document.h"
 
+#include <2geom/pathvector.h>
+
 #include "sp-star.h"
 
 static void sp_star_class_init (SPStarClass *klass);
 static void sp_star_init (SPStar *star);
 
-static void sp_star_build (SPObject * object, Document * document, Inkscape::XML::Node * repr);
+static void sp_star_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr);
 static Inkscape::XML::Node *sp_star_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
 static void sp_star_set (SPObject *object, unsigned int key, const gchar *value);
 static void sp_star_update (SPObject *object, SPCtx *ctx, guint flags);
@@ -111,7 +113,7 @@ sp_star_init (SPStar * star)
 }
 
 static void
-sp_star_build (SPObject * object, Document * document, Inkscape::XML::Node * repr)
+sp_star_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr)
 {
        if (((SPObjectClass *) parent_class)->build)
                ((SPObjectClass *) parent_class)->build (object, document, repr);
@@ -428,6 +430,21 @@ sp_star_set_shape (SPShape *shape)
 {
        SPStar *star = SP_STAR (shape);
 
+    // perhaps we should convert all our shapes into LPEs without source path
+    // and with knotholders for parameters, then this situation will be handled automatically
+    // by disabling the entire stack (including the shape LPE)
+    if (sp_lpe_item_has_broken_path_effect(SP_LPE_ITEM(shape))) {
+        g_warning ("The star shape has unknown LPE on it! Convert to path to make it editable preserving the appearance; editing it as star will remove the bad LPE");
+        if (SP_OBJECT_REPR(shape)->attribute("d")) {
+            // unconditionally read the curve from d, if any, to preserve appearance
+            Geom::PathVector pv = sp_svg_read_pathv(SP_OBJECT_REPR(shape)->attribute("d"));
+            SPCurve *cold = new SPCurve(pv);
+            sp_shape_set_curve_insync (shape, cold, TRUE);
+            cold->unref();
+        }
+        return;
+    }
+
        SPCurve *c = new SPCurve ();
 
        gint sides = star->sides;
@@ -500,7 +517,7 @@ sp_star_set_shape (SPShape *shape)
         bool success = sp_lpe_item_perform_path_effect(SP_LPE_ITEM (shape), c_lpe);
         if (success) {
             sp_shape_set_curve_insync (shape, c_lpe, TRUE);
-        }
+        } 
         c_lpe->unref();
     }
     c->unref();
@@ -587,3 +604,13 @@ sp_star_get_xy (SPStar *star, SPStarPoint point, gint index, bool randomized)
        }
 }
 
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :