Code

simplify color reading from tool style
[inkscape.git] / src / sp-star.cpp
index 767175e878efeaa34feeff1d99969dafbc64ddd3..96bc9180a9f9ff197411ee0b3f939470ae48ea97 100644 (file)
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
 
-#include "config.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
+#include <cstring>
+#include <string>
 #include <glibmm/i18n.h>
 
 #include "svg/svg.h"
@@ -30,7 +34,7 @@ static void sp_star_class_init (SPStarClass *klass);
 static void sp_star_init (SPStar *star);
 
 static void sp_star_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr);
-static Inkscape::XML::Node *sp_star_write (SPObject *object, Inkscape::XML::Node *repr, guint flags);
+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);
 
@@ -38,7 +42,7 @@ static gchar * sp_star_description (SPItem * item);
 static void sp_star_snappoints(SPItem const *item, SnapPointsIter p);
 
 static void sp_star_set_shape (SPShape *shape);
-static void sp_star_update_patheffect (SPShape *shape, bool write);
+static void sp_star_update_patheffect (SPLPEItem *lpeitem, bool write);
 
 static SPShapeClass *parent_class;
 
@@ -69,13 +73,13 @@ sp_star_class_init (SPStarClass *klass)
        GObjectClass * gobject_class;
        SPObjectClass * sp_object_class;
        SPItemClass * item_class;
-       SPPathClass * path_class;
+       SPLPEItemClass * lpe_item_class;
        SPShapeClass * shape_class;
 
        gobject_class = (GObjectClass *) klass;
        sp_object_class = (SPObjectClass *) klass;
        item_class = (SPItemClass *) klass;
-       path_class = (SPPathClass *) klass;
+       lpe_item_class = (SPLPEItemClass *) klass;
        shape_class = (SPShapeClass *) klass;
 
        parent_class = (SPShapeClass *)g_type_class_ref (SP_TYPE_SHAPE);
@@ -88,8 +92,9 @@ sp_star_class_init (SPStarClass *klass)
        item_class->description = sp_star_description;
        item_class->snappoints = sp_star_snappoints;
 
+    lpe_item_class->update_patheffect = sp_star_update_patheffect;
+
        shape_class->set_shape = sp_star_set_shape;
-    shape_class->update_patheffect = sp_star_update_patheffect;
 }
 
 static void
@@ -124,12 +129,11 @@ sp_star_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * r
 }
 
 static Inkscape::XML::Node *
-sp_star_write (SPObject *object, Inkscape::XML::Node *repr, guint flags)
+sp_star_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
 {
        SPStar *star = SP_STAR (object);
 
        if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
-               Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));
                repr = xml_doc->createElement("svg:path");
        }
 
@@ -147,13 +151,13 @@ sp_star_write (SPObject *object, Inkscape::XML::Node *repr, guint flags)
                sp_repr_set_svg_double(repr, "inkscape:randomized", star->randomized);
        }
 
-       sp_star_set_shape ((SPShape *) star);
-       char *d = sp_svg_write_path (SP_CURVE_BPATH(((SPShape *) star)->curve));
-       repr->setAttribute("d", d);
-       g_free (d);
+    sp_star_set_shape ((SPShape *) star);
+    char *d = sp_svg_write_path (((SPShape *) star)->curve->get_pathvector());
+    repr->setAttribute("d", d);
+    g_free (d);
 
        if (((SPObjectClass *) (parent_class))->write)
-               ((SPObjectClass *) (parent_class))->write (object, repr, flags);
+               ((SPObjectClass *) (parent_class))->write (object, xml_doc, repr, flags);
 
        return repr;
 }
@@ -272,21 +276,17 @@ sp_star_update (SPObject *object, SPCtx *ctx, guint flags)
 }
 
 static void
-sp_star_update_patheffect(SPShape *shape, bool write)
+sp_star_update_patheffect(SPLPEItem *lpeitem, bool write)
 {
+    SPShape *shape = (SPShape *) lpeitem;
     sp_star_set_shape(shape);
 
     if (write) {
         Inkscape::XML::Node *repr = SP_OBJECT_REPR(shape);
         if ( shape->curve != NULL ) {
-            NArtBpath *abp = sp_curve_first_bpath(shape->curve);
-            if (abp) {
-                gchar *str = sp_svg_write_path(abp);
-                repr->setAttribute("d", str);
-                g_free(str);
-            } else {
-                repr->setAttribute("d", "");
-            }
+            gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
+            repr->setAttribute("d", str);
+            g_free(str);
         } else {
             repr->setAttribute("d", NULL);
         }
@@ -428,7 +428,7 @@ sp_star_set_shape (SPShape *shape)
 {
        SPStar *star = SP_STAR (shape);
 
-       SPCurve *c = sp_curve_new ();
+       SPCurve *c = new SPCurve ();
        
        gint sides = star->sides;
        bool not_rounded = (fabs (star->rounded) < 1e-4);
@@ -437,13 +437,12 @@ sp_star_set_shape (SPShape *shape)
        // other places that call that function (e.g. the knotholder) need the exact point
 
        // draw 1st segment
-       sp_curve_moveto (c, sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
+       c->moveto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
        if (star->flatsided == false) {
                if (not_rounded) {
-                       sp_curve_lineto (c, sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
+                       c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
                } else {
-                       sp_curve_curveto (c,
-                               sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, NEXT),
+                       c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, NEXT),
                                sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, 0, PREV),
                                sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
                }
@@ -452,16 +451,14 @@ sp_star_set_shape (SPShape *shape)
        // draw all middle segments
        for (gint i = 1; i < sides; i++) {
                if (not_rounded) {
-                       sp_curve_lineto (c, sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
+                       c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
                } else {
                        if (star->flatsided == false) {
-                               sp_curve_curveto (c,
-                                               sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i - 1, NEXT),
+                               c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i - 1, NEXT),
                                                sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
                                                sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
                        } else {
-                               sp_curve_curveto (c,
-                                               sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i - 1, NEXT),
+                               c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i - 1, NEXT),
                                                sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
                                                sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
                        }
@@ -469,10 +466,9 @@ sp_star_set_shape (SPShape *shape)
                if (star->flatsided == false) {
 
                        if (not_rounded) {
-                       sp_curve_lineto (c, sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
+                       c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
                        } else {
-                               sp_curve_curveto (c,
-                                       sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, NEXT),
+                               c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, NEXT),
                                        sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i, PREV),
                                        sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
                        }
@@ -481,25 +477,23 @@ sp_star_set_shape (SPShape *shape)
        
        // draw last segment
                if (not_rounded) {
-                       sp_curve_lineto (c, sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
+                       c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
                } else {
                        if (star->flatsided == false) {
-                       sp_curve_curveto (c,
-                               sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, sides - 1, NEXT),
+                       c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, sides - 1, NEXT),
                                sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
                                sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
                        } else {
-                       sp_curve_curveto (c,
-                               sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, sides - 1, NEXT),
+                       c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, sides - 1, NEXT),
                                sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
                                sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
                        }
                }
 
-    sp_curve_closepath (c);
-    sp_shape_perform_path_effect(c, SP_SHAPE (star));
+    c->closepath();
+    sp_lpe_item_perform_path_effect(SP_LPE_ITEM (star), c);
     sp_shape_set_curve_insync (SP_SHAPE (star), c, TRUE);
-    sp_curve_unref (c);
+    c->unref();
 }
 
 void