X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-star.cpp;h=96bc9180a9f9ff197411ee0b3f939470ae48ea97;hb=96c274534e3b260291098b7da1875695fe5b30a7;hp=ea25250541faadfa83d718b8079c9ae629d6ef6b;hpb=f1244c7e85def8dc339fc92a29c0bd26ffc247d7;p=inkscape.git diff --git a/src/sp-star.cpp b/src/sp-star.cpp index ea2525054..96bc9180a 100644 --- a/src/sp-star.cpp +++ b/src/sp-star.cpp @@ -14,8 +14,12 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "config.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include #include #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,6 +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 (SPLPEItem *lpeitem, bool write); static SPShapeClass *parent_class; @@ -68,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); @@ -87,6 +92,8 @@ 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; } @@ -122,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"); } @@ -145,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; } @@ -269,6 +275,26 @@ sp_star_update (SPObject *object, SPCtx *ctx, guint flags) ((SPObjectClass *) parent_class)->update (object, ctx, flags); } +static void +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 ) { + gchar *str = sp_svg_write_path(shape->curve->get_pathvector()); + repr->setAttribute("d", str); + g_free(str); + } else { + repr->setAttribute("d", NULL); + } + } + + ((SPObject *)shape)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); +} + static gchar * sp_star_description (SPItem *item) { @@ -402,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); @@ -411,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)); } @@ -426,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)); } @@ -443,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)); } @@ -455,24 +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_set_curve_insync (SP_SHAPE (star), c, TRUE); - sp_curve_unref (c); + c->closepath(); + sp_lpe_item_perform_path_effect(SP_LPE_ITEM (star), c); + sp_shape_set_curve_insync (SP_SHAPE (star), c, TRUE); + c->unref(); } void