X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=inline;f=src%2Fsp-polygon.cpp;h=014c68c9b75652ba8af992a904325b2c0daca8db;hb=3544219f7a0314290353726315a594f92749eb96;hp=6012e065d4a11c492c95b4f876c173c3d22820ad;hpb=ecd7e11a6184f98464d8054b733d8c6851eb0d9c;p=inkscape.git diff --git a/src/sp-polygon.cpp b/src/sp-polygon.cpp index 6012e065d..014c68c9b 100644 --- a/src/sp-polygon.cpp +++ b/src/sp-polygon.cpp @@ -18,7 +18,10 @@ #include "sp-polygon.h" #include "display/curve.h" #include -#include "libnr/n-art-bpath.h" +#include <2geom/pathvector.h> +#include <2geom/bezier-curve.h> +#include <2geom/hvlinesegment.h> +#include "helper/geom-curves.h" #include "svg/stringstream.h" #include "xml/repr.h" #include "document.h" @@ -27,8 +30,7 @@ static void sp_polygon_class_init(SPPolygonClass *pc); static void sp_polygon_init(SPPolygon *polygon); static void sp_polygon_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr); -static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); -static void sp_polygon_set(SPObject *object, unsigned int key, const gchar *value); +static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); static gchar *sp_polygon_description(SPItem *item); @@ -88,34 +90,28 @@ static void sp_polygon_build(SPObject *object, SPDocument *document, Inkscape::X /* * sp_svg_write_polygon: Write points attribute for polygon tag. - * @bpath: - * + * pathv may only contain paths with only straight line segments * Return value: points attribute string. */ -static gchar *sp_svg_write_polygon(const NArtBpath *bpath) +static gchar *sp_svg_write_polygon(Geom::PathVector const & pathv) { - g_return_val_if_fail(bpath != NULL, NULL); - Inkscape::SVGOStringStream os; - for (int i = 0; bpath[i].code != NR_END; i++) { - switch (bpath [i].code) { - case NR_LINETO: - case NR_MOVETO: - case NR_MOVETO_OPEN: - os << bpath [i].x3 << "," << bpath [i].y3 << " "; - break; - - case NR_CURVETO: - default: - g_assert_not_reached(); + for (Geom::PathVector::const_iterator pit = pathv.begin(); pit != pathv.end(); ++pit) { + for (Geom::Path::const_iterator cit = pit->begin(); cit != pit->end_default(); ++cit) { + if ( is_straight_curve(*cit) ) + { + os << cit->finalPoint()[0] << "," << cit->finalPoint()[1] << " "; + } else { + g_error("sp_svg_write_polygon: polygon path contains non-straight line segments"); + } } } return g_strdup(os.str().c_str()); } -static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPShape *shape = SP_SHAPE(object); // Tolerable workaround: we need to update the object's curve before we set points= @@ -123,18 +119,16 @@ static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::No sp_shape_set_shape(shape); 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:polygon"); } /* We can safely write points here, because all subclasses require it too (Lauris) */ - NArtBpath *abp = shape->curve->first_bpath(); - gchar *str = sp_svg_write_polygon(abp); + gchar *str = sp_svg_write_polygon(shape->curve->get_pathvector()); repr->setAttribute("points", str); g_free(str); if (((SPObjectClass *) (parent_class))->write) { - ((SPObjectClass *) (parent_class))->write(object, repr, flags); + ((SPObjectClass *) (parent_class))->write(object, xml_doc, repr, flags); } return repr; @@ -162,7 +156,7 @@ static gboolean polygon_get_value(gchar const **p, gdouble *v) } -static void sp_polygon_set(SPObject *object, unsigned int key, const gchar *value) +void sp_polygon_set(SPObject *object, unsigned int key, const gchar *value) { SPPolygon *polygon = SP_POLYGON(object); @@ -210,14 +204,9 @@ static void sp_polygon_set(SPObject *object, unsigned int key, const gchar *valu if (has_error || *cptr != '\0') { /* TODO: Flag the document as in error, as per * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing. */ - } else if (curve->_posSet) { - /* We've done a moveto but no lineto. I'm not sure how we're supposed to represent - * a single-point polygon in SPCurve: sp_curve_closepath at the time of writing - * doesn't seem to like simply moveto followed by closepath. The following works, - * but won't round-trip properly: I believe it will write as two points rather than - * one. */ - curve->lineto(curve->_movePos); } else if (hascpt) { + /* We might have done a moveto but no lineto. I'm not sure how we're supposed to represent + * a single-point polygon in SPCurve. TODO: add a testcase with only one coordinate pair */ curve->closepath(); } sp_shape_set_curve(SP_SHAPE(polygon), curve, TRUE);