X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-offset.cpp;h=ae0f7bf19ea48bebe09cc7ccf91f12f6958aff74;hb=0b51e8dca51e424e491522197eb7ca55e45a38b4;hp=d866df068b3021262ad51390d5a06c12e08cb7fa;hpb=ff10ef00a3847886fff81e690d2f329f5eba2253;p=inkscape.git diff --git a/src/sp-offset.cpp b/src/sp-offset.cpp index d866df068..ae0f7bf19 100644 --- a/src/sp-offset.cpp +++ b/src/sp-offset.cpp @@ -31,14 +31,14 @@ #include "livarot/Shape.h" #include "enums.h" -#include "prefs-utils.h" +#include "preferences.h" #include "sp-text.h" #include "sp-offset.h" #include "sp-use-reference.h" #include "uri.h" -#include "libnr/n-art-bpath.h" #include +#include <2geom/pathvector.h> #include "xml/repr.h" @@ -75,7 +75,7 @@ static void sp_offset_finalize(GObject *obj); static void sp_offset_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr); -static Inkscape::XML::Node *sp_offset_write (SPObject * object, Inkscape::XML::Node * repr, +static Inkscape::XML::Node *sp_offset_write (SPObject * object, Inkscape::XML::Document *doc, Inkscape::XML::Node * repr, guint flags); static void sp_offset_set (SPObject * object, unsigned int key, const gchar * value); @@ -83,17 +83,15 @@ static void sp_offset_update (SPObject * object, SPCtx * ctx, guint flags); static void sp_offset_release (SPObject * object); static gchar *sp_offset_description (SPItem * item); -static void sp_offset_snappoints(SPItem const *item, SnapPointsIter p); +static void sp_offset_snappoints(SPItem const *item, bool const target, SnapPointsWithType &p, Inkscape::SnapPreferences const *snapprefs); static void sp_offset_set_shape (SPShape * shape); -Path *bpath_to_liv_path (NArtBpath * bpath); - static void refresh_offset_source(SPOffset* offset); static void sp_offset_start_listening(SPOffset *offset,SPObject* to); static void sp_offset_quit_listening(SPOffset *offset); static void sp_offset_href_changed(SPObject *old_ref, SPObject *ref, SPOffset *offset); -static void sp_offset_move_compensate(NR::Matrix const *mp, SPItem *original, SPOffset *self); +static void sp_offset_move_compensate(Geom::Matrix const *mp, SPItem *original, SPOffset *self); static void sp_offset_delete_self(SPObject *deleted, SPOffset *self); static void sp_offset_source_modified (SPObject *iSource, guint flags, SPItem *item); @@ -243,7 +241,7 @@ sp_offset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *rep gchar const *oldA = object->repr->attribute("inkscape:href"); if (oldA) { size_t lA = strlen(oldA); - char *nA=(char*)malloc((lA+1)*sizeof(char)); + char *nA=(char*)malloc((1+lA+1)*sizeof(char)); memcpy(nA+1,oldA,lA*sizeof(char)); nA[0]='#'; nA[lA+1]=0; @@ -259,12 +257,11 @@ sp_offset_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *rep * Virtual write: write offset attributes to corresponding repr. */ static Inkscape::XML::Node * -sp_offset_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +sp_offset_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPOffset *offset = SP_OFFSET (object); if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) { - Inkscape::XML::Document *xml_doc = SP_OBJECT_REPR(object)->document(); repr = xml_doc->createElement("svg:path"); } @@ -287,12 +284,12 @@ sp_offset_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) } // write that curve to "d" - char *d = sp_svg_write_path (SP_CURVE_BPATH(((SPShape *) offset)->curve)); + char *d = sp_svg_write_path (((SPShape *) offset)->curve->get_pathvector()); repr->setAttribute("d", d); g_free (d); if (((SPObjectClass *) (parent_class))->write) - ((SPObjectClass *) (parent_class))->write (object, repr, + ((SPObjectClass *) (parent_class))->write (object, xml_doc, repr, flags | SP_SHAPE_WRITE_PATH); return repr; @@ -348,16 +345,12 @@ sp_offset_set(SPObject *object, unsigned key, gchar const *value) offset->original = NULL; offset->originalPath = NULL; } - NArtBpath *bpath; - SPCurve *curve; offset->original = strdup (value); - bpath = sp_svg_read_path (offset->original); - curve = SPCurve::new_from_bpath (bpath); // curve se chargera de detruire bpath - g_assert (curve != NULL); - offset->originalPath = bpath_to_liv_path (SP_CURVE_BPATH(curve)); - curve->unref(); + Geom::PathVector pv = sp_svg_read_pathv(offset->original); + offset->originalPath = new Path; + reinterpret_cast(offset->originalPath)->LoadPathVector(pv); offset->knotSet = false; if ( offset->isUpdating == false ) object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); @@ -439,75 +432,6 @@ sp_offset_description(SPItem *item) } } -/** - * Converts an NArtBpath (like the one stored in a SPCurve) into a - * livarot Path. Duplicate of splivarot. - */ -Path * -bpath_to_liv_path(NArtBpath *bpath) -{ - if (bpath == NULL) - return NULL; - - Path *dest = new Path; - dest->SetBackData (false); - { - int i; - bool closed = false; - float lastX = 0.0; - float lastY = 0.0; - - for (i = 0; bpath[i].code != NR_END; i++) - { - switch (bpath[i].code) - { - case NR_LINETO: - lastX = bpath[i].x3; - lastY = bpath[i].y3; - { - NR::Point tmp(lastX,lastY); - dest->LineTo (tmp); - } - break; - - case NR_CURVETO: - { - NR::Point tmp(bpath[i].x3, bpath[i].y3); - NR::Point tms; - tms[0]=3 * (bpath[i].x1 - lastX); - tms[1]=3 * (bpath[i].y1 - lastY); - NR::Point tme; - tme[0]=3 * (bpath[i].x3 - bpath[i].x2); - tme[1]= 3 * (bpath[i].y3 - bpath[i].y2); - dest->CubicTo (tmp,tms,tme); - } - lastX = bpath[i].x3; - lastY = bpath[i].y3; - break; - - case NR_MOVETO_OPEN: - case NR_MOVETO: - if (closed) - dest->Close (); - closed = (bpath[i].code == NR_MOVETO); - lastX = bpath[i].x3; - lastY = bpath[i].y3; - { - NR::Point tmp(lastX,lastY); - dest->MoveTo(tmp); - } - break; - default: - break; - } - } - if (closed) - dest->Close (); - } - - return dest; -} - /** * Compute and set shape's offset. */ @@ -532,8 +456,8 @@ sp_offset_set_shape(SPShape *shape) const char *res_d = SP_OBJECT(shape)->repr->attribute("inkscape:original"); if ( res_d ) { - NArtBpath *bpath = sp_svg_read_path (res_d); - SPCurve *c = SPCurve::new_from_bpath (bpath); + Geom::PathVector pv = sp_svg_read_pathv(res_d); + SPCurve *c = new SPCurve(pv); g_assert(c != NULL); sp_shape_set_curve_insync ((SPShape *) offset, c, TRUE); c->unref(); @@ -586,10 +510,10 @@ sp_offset_set_shape(SPShape *shape) theRes->ConvertToForme (orig, 1, originaux); SPItem *item = shape; - NR::Maybe bbox = sp_item_bbox_desktop (item); - if ( bbox && !bbox->isEmpty() ) { + Geom::OptRect bbox = sp_item_bbox_desktop (item); + if ( bbox ) { gdouble size = L2(bbox->dimensions()); - gdouble const exp = NR::expansion(item->transform); + gdouble const exp = item->transform.descrim(); if (exp != 0) size /= exp; orig->Coalesce (size * 0.001); @@ -781,8 +705,8 @@ sp_offset_set_shape(SPShape *shape) } delete orig; - NArtBpath *bpath = sp_svg_read_path (res_d); - SPCurve *c = SPCurve::new_from_bpath (bpath); + Geom::PathVector pv = sp_svg_read_pathv(res_d); + SPCurve *c = new SPCurve(pv); g_assert(c != NULL); sp_shape_set_curve_insync ((SPShape *) offset, c, TRUE); c->unref(); @@ -794,10 +718,10 @@ sp_offset_set_shape(SPShape *shape) /** * Virtual snappoints function. */ -static void sp_offset_snappoints(SPItem const *item, SnapPointsIter p) +static void sp_offset_snappoints(SPItem const *item, bool const target, SnapPointsWithType &p, Inkscape::SnapPreferences const *snapprefs) { if (((SPItemClass *) parent_class)->snappoints) { - ((SPItemClass *) parent_class)->snappoints (item, p); + ((SPItemClass *) parent_class)->snappoints (item, target, p, snapprefs); } } @@ -822,9 +746,9 @@ static void sp_offset_snappoints(SPItem const *item, SnapPointsIter p) * -- njh */ bool -vectors_are_clockwise (NR::Point A, NR::Point B, NR::Point C) +vectors_are_clockwise (Geom::Point A, Geom::Point B, Geom::Point C) { - using NR::rot90; + using Geom::rot90; double ab_s = dot(A, rot90(B)); double ab_c = dot(A, B); double bc_s = dot(B, rot90(C)); @@ -870,7 +794,7 @@ vectors_are_clockwise (NR::Point A, NR::Point B, NR::Point C) * 'px inside source'. */ double -sp_offset_distance_to_original (SPOffset * offset, NR::Point px) +sp_offset_distance_to_original (SPOffset * offset, Geom::Point px) { if (offset == NULL || offset->originalPath == NULL || ((Path *) offset->originalPath)->descr_cmd.size() <= 1) @@ -908,14 +832,14 @@ sp_offset_distance_to_original (SPOffset * offset, NR::Point px) { if (theRes->getPoint(i).totalDegree() > 0) { - NR::Point nx = theRes->getPoint(i).x; - NR::Point nxpx = px-nx; + Geom::Point nx = theRes->getPoint(i).x; + Geom::Point nxpx = px-nx; double ndist = sqrt (dot(nxpx,nxpx)); if (ptSet == false || fabs (ndist) < fabs (ptDist)) { // we have a new minimum distance // now we need to wheck if px is inside or outside (for the sign) - nx = px - theRes->getPoint(i).x; + nx = px - to_2geom(theRes->getPoint(i).x); double nlen = sqrt (dot(nx , nx)); nx /= nlen; int pb, cb, fb; @@ -925,7 +849,7 @@ sp_offset_distance_to_original (SPOffset * offset, NR::Point px) do { // one angle - NR::Point prx, nex; + Geom::Point prx, nex; prx = theRes->getEdge(pb).dx; nlen = sqrt (dot(prx, prx)); prx /= nlen; @@ -961,18 +885,18 @@ sp_offset_distance_to_original (SPOffset * offset, NR::Point px) } while (cb >= 0 && pb >= 0 && pb != fb); } - } + } } // loop over the edges to try to improve the distance for (int i = 0; i < theRes->numberOfEdges(); i++) { - NR::Point sx = theRes->getPoint(theRes->getEdge(i).st).x; - NR::Point ex = theRes->getPoint(theRes->getEdge(i).en).x; - NR::Point nx = ex - sx; + Geom::Point sx = theRes->getPoint(theRes->getEdge(i).st).x; + Geom::Point ex = theRes->getPoint(theRes->getEdge(i).en).x; + Geom::Point nx = ex - sx; double len = sqrt (dot(nx,nx)); if (len > 0.0001) - { - NR::Point pxsx=px-sx; + { + Geom::Point pxsx=px-sx; double ab = dot(nx,pxsx); if (ab > 0 && ab < len * len) { @@ -984,7 +908,7 @@ sp_offset_distance_to_original (SPOffset * offset, NR::Point px) arSet = true; } } - } + } } if (arSet || ptSet) { @@ -1012,9 +936,9 @@ sp_offset_distance_to_original (SPOffset * offset, NR::Point px) * \return the topmost point on the offset. */ void -sp_offset_top_point (SPOffset * offset, NR::Point *px) +sp_offset_top_point (SPOffset * offset, Geom::Point *px) { - (*px) = NR::Point(0, 0); + (*px) = Geom::Point(0, 0); if (offset == NULL) return; @@ -1032,14 +956,15 @@ sp_offset_top_point (SPOffset * offset, NR::Point *px) if (curve == NULL) return; } - - Path *finalPath = bpath_to_liv_path (SP_CURVE_BPATH(curve)); - if (finalPath == NULL) + if (curve->is_empty()) { curve->unref(); return; } + Path *finalPath = new Path; + finalPath->LoadPathVector(curve->get_pathvector()); + Shape *theShape = new Shape; finalPath->Convert (1.0); @@ -1096,23 +1021,24 @@ sp_offset_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPOffset *offse } static void -sp_offset_move_compensate(NR::Matrix const *mp, SPItem */*original*/, SPOffset *self) +sp_offset_move_compensate(Geom::Matrix const *mp, SPItem */*original*/, SPOffset *self) { - guint mode = prefs_get_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_PARALLEL); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + guint mode = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_PARALLEL); if (mode == SP_CLONE_COMPENSATION_NONE) return; - NR::Matrix m(*mp); - if (!(m.is_translation())) return; + Geom::Matrix m(*mp); + if (!(m.isTranslation())) return; // calculate the compensation matrix and the advertized movement matrix SPItem *item = SP_ITEM(self); - NR::Matrix compensate; - NR::Matrix advertized_move; + Geom::Matrix compensate; + Geom::Matrix advertized_move; if (mode == SP_CLONE_COMPENSATION_UNMOVED) { - compensate = NR::identity(); - advertized_move.set_identity(); + compensate = Geom::identity(); + advertized_move.setIdentity(); } else if (mode == SP_CLONE_COMPENSATION_PARALLEL) { compensate = m; advertized_move = m; @@ -1130,7 +1056,8 @@ sp_offset_move_compensate(NR::Matrix const *mp, SPItem */*original*/, SPOffset * static void sp_offset_delete_self(SPObject */*deleted*/, SPOffset *offset) { - guint const mode = prefs_get_int_attribute("options.cloneorphans", "value", SP_CLONE_ORPHANS_UNLINK); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + guint const mode = prefs->getInt("/options/cloneorphans/value", SP_CLONE_ORPHANS_UNLINK); if (mode == SP_CLONE_ORPHANS_UNLINK) { // leave it be. just forget about the source @@ -1157,7 +1084,6 @@ refresh_offset_source(SPOffset* offset) { if ( offset == NULL ) return; offset->sourceDirty=false; - Path *orig = NULL; // le mauvais cas: pas d'attribut d => il faut verifier que c'est une SPShape puis prendre le contour // The bad case: no d attribute. Must check that it's an SPShape and then take the outline. @@ -1175,9 +1101,10 @@ refresh_offset_source(SPOffset* offset) if (SP_IS_TEXT (item)) { curve = SP_TEXT (item)->getNormalizedBpath (); if (curve == NULL) - return; + return; } - orig = bpath_to_liv_path (SP_CURVE_BPATH(curve)); + Path *orig = new Path; + orig->LoadPathVector(curve->get_pathvector()); curve->unref();