From: johanengelen Date: Tue, 8 Jul 2008 17:55:15 +0000 (+0000) Subject: * 2geomify polygon svg writing X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=61f0bc9dfe9dee35ba3522153a7409cceb8434cd;p=inkscape.git * 2geomify polygon svg writing * 2geomify caligraphy and erasertool svg writing --- diff --git a/src/dyna-draw-context.cpp b/src/dyna-draw-context.cpp index 68bb2f163..8db9cb2e1 100644 --- a/src/dyna-draw-context.cpp +++ b/src/dyna-draw-context.cpp @@ -52,6 +52,7 @@ #include "libnr/nr-path.h" #include "libnr/nr-matrix-ops.h" #include "libnr/nr-scale-translate-ops.h" +#include "libnr/nr-convert2geom.h" #include "xml/repr.h" #include "context-fns.h" #include "sp-item.h" @@ -65,7 +66,8 @@ #include "display/canvas-bpath.h" #include "display/canvas-arena.h" #include "livarot/Shape.h" -#include "2geom/isnan.h" +#include <2geom/isnan.h> +#include <2geom/pathvector.h> #include "dyna-draw-context.h" @@ -971,9 +973,6 @@ set_to_accumulated(SPDynaDrawContext *dc, bool unionize) SPDesktop *desktop = SP_EVENT_CONTEXT(dc)->desktop; if (!dc->accumulated->is_empty()) { - NArtBpath *abp; - gchar *str; - if (!dc->repr) { /* Create object */ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc()); @@ -989,10 +988,9 @@ set_to_accumulated(SPDynaDrawContext *dc, bool unionize) item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer()); item->updateRepr(); } - abp = nr_artpath_affine(dc->accumulated->get_bpath(), sp_desktop_dt2root_affine(desktop)); - str = sp_svg_write_path(abp); + Geom::PathVector pathv = dc->accumulated->get_pathvector() * to_2geom(sp_desktop_dt2root_affine(desktop)); + gchar *str = sp_svg_write_path(pathv); g_assert( str != NULL ); - g_free(abp); dc->repr->setAttribute("d", str); g_free(str); diff --git a/src/eraser-context.cpp b/src/eraser-context.cpp index 605c6971d..6cfd915ef 100644 --- a/src/eraser-context.cpp +++ b/src/eraser-context.cpp @@ -48,10 +48,6 @@ #include "message-context.h" #include "prefs-utils.h" #include "pixmaps/cursor-eraser.xpm" -#include "libnr/n-art-bpath.h" -#include "libnr/nr-path.h" -#include "libnr/nr-matrix-ops.h" -#include "libnr/nr-scale-translate-ops.h" #include "xml/repr.h" #include "context-fns.h" #include "sp-item.h" @@ -66,7 +62,8 @@ #include "display/canvas-bpath.h" #include "display/canvas-arena.h" #include "livarot/Shape.h" -#include "2geom/isnan.h" +#include <2geom/isnan.h> +#include <2geom/pathvector.h> #include "eraser-context.h" @@ -718,9 +715,6 @@ set_to_accumulated(SPEraserContext *dc) bool workDone = false; if (!dc->accumulated->is_empty()) { - NArtBpath *abp; - gchar *str; - if (!dc->repr) { /* Create object */ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc()); @@ -736,10 +730,9 @@ set_to_accumulated(SPEraserContext *dc) item->transform = SP_ITEM(desktop->currentRoot())->getRelativeTransform(desktop->currentLayer()); item->updateRepr(); } - abp = nr_artpath_affine(dc->accumulated->get_bpath(), sp_desktop_dt2root_affine(desktop)); - str = sp_svg_write_path(abp); + Geom::PathVector pathv = dc->accumulated->get_pathvector() * to_2geom(sp_desktop_dt2root_affine(desktop)); + gchar *str = sp_svg_write_path(pathv); g_assert( str != NULL ); - g_free(abp); dc->repr->setAttribute("d", str); g_free(str); diff --git a/src/sp-polygon.cpp b/src/sp-polygon.cpp index 88b155e8e..04046a47d 100644 --- a/src/sp-polygon.cpp +++ b/src/sp-polygon.cpp @@ -18,7 +18,7 @@ #include "sp-polygon.h" #include "display/curve.h" #include -#include "libnr/n-art-bpath.h" +#include <2geom/pathvector.h> #include "svg/stringstream.h" #include "xml/repr.h" #include "document.h" @@ -87,27 +87,23 @@ 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 ( dynamic_cast(&*cit) || + dynamic_cast(&*cit) || + dynamic_cast(&*cit) ) + { + os << cit->finalPoint()[0] << "," << cit->finalPoint()[1] << " "; + } else { + g_error("sp_svg_write_polygon: polygon path contains non-straight line segments"); + } } } @@ -126,8 +122,7 @@ static Inkscape::XML::Node *sp_polygon_write(SPObject *object, Inkscape::XML::Do } /* We can safely write points here, because all subclasses require it too (Lauris) */ - NArtBpath const * abp = shape->curve->get_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);