From a5e13ccd37256098e74af9c865a5becb6a2b8c79 Mon Sep 17 00:00:00 2001 From: johanengelen Date: Wed, 13 Aug 2008 18:49:22 +0000 Subject: [PATCH] return boost::optional for second and penultimate points of SPCurve --- src/display/curve-test.h | 24 ++++++++++----------- src/display/curve.cpp | 45 +++++++++++++++++++++++----------------- src/display/curve.h | 6 ++++-- src/pencil-context.cpp | 2 +- src/sp-conn-end.cpp | 8 +++---- 5 files changed, 47 insertions(+), 38 deletions(-) diff --git a/src/display/curve-test.h b/src/display/curve-test.h index a45f01afd..56b49ff4c 100644 --- a/src/display/curve-test.h +++ b/src/display/curve-test.h @@ -215,32 +215,32 @@ public: void testSecondPoint() { - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path1)).second_point() , Geom::Point(1,0)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path2)).second_point() , Geom::Point(3,0)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path3)).second_point() , Geom::Point(5,1)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path4)).second_point() , Geom::Point(3,5)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path1)).second_point()) , Geom::Point(1,0)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path2)).second_point()) , Geom::Point(3,0)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path3)).second_point()) , Geom::Point(5,1)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path4)).second_point()) , Geom::Point(3,5)); Geom::PathVector pv; pv.push_back(path1); pv.push_back(path2); pv.push_back(path3); - TS_ASSERT_EQUALS(SPCurve(pv).second_point() , Geom::Point(1,0)); + TS_ASSERT_EQUALS( *(SPCurve(pv).second_point()) , Geom::Point(1,0)); pv.insert(pv.begin(), path4); - TS_ASSERT_EQUALS(SPCurve(pv).second_point() , Geom::Point(0,0)); + TS_ASSERT_EQUALS( SPCurve(pv).second_point() == false, true ); } void testPenultimatePoint() { - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path1)).penultimate_point() , Geom::Point(1,1)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path2)).penultimate_point() , Geom::Point(3,0)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path3)).penultimate_point() , Geom::Point(6,4)); - TS_ASSERT_EQUALS(SPCurve(Geom::PathVector(1, path4)).penultimate_point() , Geom::Point(3,5)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path1)).penultimate_point()) , Geom::Point(1,1)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path2)).penultimate_point()) , Geom::Point(3,0)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path3)).penultimate_point()) , Geom::Point(6,4)); + TS_ASSERT_EQUALS( *(SPCurve(Geom::PathVector(1, path4)).penultimate_point()) , Geom::Point(3,5)); Geom::PathVector pv; pv.push_back(path1); pv.push_back(path2); pv.push_back(path3); - TS_ASSERT_EQUALS(SPCurve(pv).penultimate_point() , Geom::Point(6,4)); + TS_ASSERT_EQUALS( *(SPCurve(pv).penultimate_point()) , Geom::Point(6,4)); pv.push_back(path4); - TS_ASSERT_EQUALS(SPCurve(pv).penultimate_point() , Geom::Point(8,4)); + TS_ASSERT_EQUALS( *(SPCurve(pv).penultimate_point()) , Geom::Point(8,4)); } // TODO: Rest of the methods diff --git a/src/display/curve.cpp b/src/display/curve.cpp index d142b6eac..9f6c34981 100644 --- a/src/display/curve.cpp +++ b/src/display/curve.cpp @@ -373,48 +373,55 @@ SPCurve::first_point() const /** * Return the second point of first subpath or _movePos if curve too short. - * If the pathvector is empty, this returns (0,0). If the first path is only a moveto, this method + * If the pathvector is empty, this returns nothing. If the first path is only a moveto, this method * returns the first point of the second path, if it exists. If there is no 2nd path, it returns the * first point of the first path. - * - * FIXME: for empty paths shouldn't this return (NR_HUGE,NR_HUGE) */ -Geom::Point +boost::optional SPCurve::second_point() const { - if (is_empty()) { - return Geom::Point(0,0); - } - else if (_pathv.front().empty()) { - // first path is only a moveto - // check if there is second path - if (_pathv.size() > 1) { - return _pathv[1].initialPoint(); + boost::optional retval; + if (!is_empty()) { + if (_pathv.front().empty()) { + // first path is only a moveto + // check if there is second path + if (_pathv.size() > 1) { + retval = _pathv[1].initialPoint(); + } else { + retval = _pathv[0].initialPoint(); + } } else { - return _pathv[0].initialPoint(); + retval = _pathv.front()[0].finalPoint(); } } - else - return _pathv.front()[0].finalPoint(); + + return retval; } /** * TODO: fix comment: Return the second-last point of last subpath or _movePos if curve too short. */ -Geom::Point +boost::optional SPCurve::penultimate_point() const { - Geom::Curve const& back = _pathv.back().back_default(); - return back.initialPoint(); + boost::optional retval; + if (!is_empty()) { + Geom::Curve const& back = _pathv.back().back_default(); + retval = back.initialPoint(); + } + + return retval; } /** * Return last point of last subpath or (0,0). TODO: shouldn't this be (NR_HUGE, NR_HUGE) to be able to tell it apart from normal (0,0) ? * If the last path is only a moveto, then return that point. */ -Geom::Point +boost::optional SPCurve::last_point() const { + boost::optional retval; + if (is_empty()) return Geom::Point(0, 0); diff --git a/src/display/curve.h b/src/display/curve.h index c3659de07..8bb3fb360 100644 --- a/src/display/curve.h +++ b/src/display/curve.h @@ -20,6 +20,8 @@ #include <2geom/forward.h> +#include + class SPCurve { public: /* Constructors */ @@ -48,8 +50,8 @@ public: Geom::Path const * first_path() const; Geom::Point first_point() const; Geom::Point last_point() const; - Geom::Point second_point() const; - Geom::Point penultimate_point() const; + boost::optional second_point() const; + boost::optional penultimate_point() const; void reset(); diff --git a/src/pencil-context.cpp b/src/pencil-context.cpp index 2c97beafe..4a7032e70 100644 --- a/src/pencil-context.cpp +++ b/src/pencil-context.cpp @@ -592,7 +592,7 @@ static void spdc_finish_endpoint(SPPencilContext *const pc) { if ( ( pc->red_curve->is_empty() ) - || ( pc->red_curve->first_point() == pc->red_curve->second_point() ) ) + || ( pc->red_curve->first_point() == *(pc->red_curve->second_point()) ) ) { pc->red_curve->reset(); sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(pc->red_bpath), NULL); diff --git a/src/sp-conn-end.cpp b/src/sp-conn-end.cpp index 40017912f..947a88d71 100644 --- a/src/sp-conn-end.cpp +++ b/src/sp-conn-end.cpp @@ -68,8 +68,8 @@ sp_conn_end_move_compensate(NR::Matrix const */*mp*/, SPItem */*moved_item*/, NR::Matrix h2i2anc[2]; NR::Rect h2bbox_icoordsys[2]; NR::Point last_seg_endPt[2] = { - path->curve->second_point(), - path->curve->penultimate_point() + *(path->curve->second_point()), + *(path->curve->penultimate_point()) }; for (unsigned h = 0; h < 2; ++h) { boost::optional bbox = h2attItem[h]->getBounds(NR::identity()); @@ -102,12 +102,12 @@ sp_conn_end_move_compensate(NR::Matrix const */*mp*/, SPItem */*moved_item*/, NR::Point last_seg_pt; if (h2attItem[0] != NULL) { other_endpt = path->curve->last_point(); - last_seg_pt = path->curve->second_point(); + last_seg_pt = *(path->curve->second_point()); ind = 0; } else { other_endpt = path->curve->first_point(); - last_seg_pt = path->curve->penultimate_point(); + last_seg_pt = *(path->curve->penultimate_point()); ind = 1; } NR::Point h2endPt_icoordsys[2]; -- 2.30.2