diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-02 05:32:34 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-12-02 05:32:34 -0500 |
commit | db3d42d5519c53f45721ffced7dce3b1dc032c16 (patch) | |
tree | 4101a95deb0656b8251802eb13cadd6282eca730 /libs | |
parent | cf47d71761ec5b7539a4dce493e711387f442e43 (diff) |
first pass at optimization for low-level canvas code
Diffstat (limited to 'libs')
-rw-r--r-- | libs/canvas/canvas/types.h | 104 | ||||
-rw-r--r-- | libs/canvas/types.cc | 156 |
2 files changed, 85 insertions, 175 deletions
diff --git a/libs/canvas/canvas/types.h b/libs/canvas/canvas/types.h index ff9388f7ba..4cba084637 100644 --- a/libs/canvas/canvas/types.h +++ b/libs/canvas/canvas/types.h @@ -23,6 +23,7 @@ #include <iostream> #include <vector> #include <stdint.h> +#include <algorithm> #include <boost/optional.hpp> #include <cairomm/refptr.h> @@ -42,6 +43,17 @@ typedef uint32_t Color; extern LIBCANVAS_API Coord const COORD_MAX; +inline Coord +canvas_safe_add (Coord a, Coord b) +{ + if (((COORD_MAX - a) <= b) || ((COORD_MAX - b) <= a)) { + return COORD_MAX; + } + + return a + b; +} + + struct LIBCANVAS_API Duple { Duple () @@ -57,16 +69,31 @@ struct LIBCANVAS_API Duple Coord x; Coord y; - Duple translate (Duple) const; + Duple translate (const Duple& t) const throw() { + return Duple (canvas_safe_add (x, t.x), canvas_safe_add (y, t.y)); + } + + Duple operator- () const throw () { + return Duple (-x, -y); + } + Duple operator+ (Duple const & o) const throw () { + return Duple (canvas_safe_add (x, o.x), canvas_safe_add (y, o.y)); + } + bool operator== (Duple const & o) const throw () { + return x == o.x && y == o.y; + } + bool operator!= (Duple const & o) const throw () { + return x != o.x || y != o.y; + } + Duple operator- (Duple const & o) const throw () { + return Duple (x - o.x, y - o.y); + } + Duple operator/ (double b) const throw () { + return Duple (x / b, y / b); + } }; -extern LIBCANVAS_API Duple operator- (Duple const &); -extern LIBCANVAS_API Duple operator+ (Duple const &, Duple const &); -extern LIBCANVAS_API bool operator== (Duple const &, Duple const &); -extern LIBCANVAS_API bool operator!= (Duple const &, Duple const &); -extern LIBCANVAS_API Duple operator- (Duple const &, Duple const &); -extern LIBCANVAS_API Duple operator/ (Duple const &, double); extern LIBCANVAS_API std::ostream & operator<< (std::ostream &, Duple const &); struct LIBCANVAS_API Rect @@ -90,26 +117,65 @@ struct LIBCANVAS_API Rect Coord x1; Coord y1; - boost::optional<Rect> intersection (Rect const &) const; - Rect extend (Rect const &) const; - Rect translate (Duple) const; - Rect expand (Distance) const; - Rect shrink (Distance) const; - bool contains (Duple) const; - Rect fix () const; - bool empty() const { return (x0 == x1 && y0 == y1); } + boost::optional<Rect> intersection (Rect const & o) const throw () { + Rect i (std::max (x0, o.x0), std::max (y0, o.y0), + std::min (x1, o.x1), std::min (y1, o.y1)); + + if (i.x0 > i.x1 || i.y0 > i.y1) { + return boost::optional<Rect> (); + } + + return boost::optional<Rect> (i); + } + + Rect extend (Rect const & o) const throw () { + return Rect (std::min (x0, o.x0), std::min (y0, o.y0), + std::max (x1, o.x1), std::max (y1, o.y1)); + } + Rect translate (Duple const& t) const throw () { + return Rect (canvas_safe_add (x0, t.x), canvas_safe_add (y0, t.y), + canvas_safe_add (x1, t.x),canvas_safe_add (y1, t.y)); + } + Rect expand (Distance amount) const throw () { + return Rect (x0 - amount, y0 - amount, + canvas_safe_add (x1, amount), + canvas_safe_add (y1, amount)); + } + + Rect shrink (Distance amount) const throw () { + /* This isn't the equivalent of expand (-distance) because + of the peculiarities of canvas_safe_add() with negative values. + Maybe. + */ + return Rect (canvas_safe_add (x0, amount), canvas_safe_add (y0, amount), + x1 - amount, y1 - amount); + } + + bool contains (Duple const & point) const throw () { + return point.x >= x0 && point.x <= x1 && point.y >= y0 && point.y <= y1; + } + Rect fix () const throw () { + return Rect (std::min (x0, x1), std::min (y0, y1), + std::max (x0, x1), std::max (y0, y1)); + } + + bool empty() const throw () { return (x0 == x1 && y0 == y1); } - Distance width () const { + Distance width () const throw () { return x1 - x0; } - Distance height () const { + Distance height () const throw () { return y1 - y0; } + bool operator!= (Rect const & o) const throw () { + return x0 != o.x0 || + x1 != o.x1 || + y0 != o.y0 || + y1 != o.y1; + } }; -extern LIBCANVAS_API bool operator!= (Rect const &, Rect const &); - extern LIBCANVAS_API std::ostream & operator<< (std::ostream &, Rect const &); typedef std::vector<Duple> Points; diff --git a/libs/canvas/types.cc b/libs/canvas/types.cc index 4c8cd854f2..536147a7f4 100644 --- a/libs/canvas/types.cc +++ b/libs/canvas/types.cc @@ -17,7 +17,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <algorithm> #include <cfloat> #include <cassert> @@ -30,161 +29,6 @@ using namespace ArdourCanvas; Coord const ArdourCanvas::COORD_MAX = 1.7e307; -static inline Coord -safe_add (Coord a, Coord b) -{ - if (((COORD_MAX - a) <= b) || ((COORD_MAX - b) <= a)) { - return COORD_MAX; - } - - return a + b; -} - -Duple -Duple::translate (Duple t) const -{ - Duple d; - - d.x = safe_add (x, t.x); - d.y = safe_add (y, t.y); - - return d; -} - -boost::optional<Rect> -Rect::intersection (Rect const & o) const -{ - Rect i; - - i.x0 = max (x0, o.x0); - i.y0 = max (y0, o.y0); - i.x1 = min (x1, o.x1); - i.y1 = min (y1, o.y1); - - if (i.x0 > i.x1 || i.y0 > i.y1) { - return boost::optional<Rect> (); - } - - return boost::optional<Rect> (i); -} - -Rect -Rect::translate (Duple t) const -{ - Rect r; - - r.x0 = safe_add (x0, t.x); - r.y0 = safe_add (y0, t.y); - r.x1 = safe_add (x1, t.x); - r.y1 = safe_add (y1, t.y); - return r; -} - -Rect -Rect::extend (Rect const & o) const -{ - Rect r; - r.x0 = min (x0, o.x0); - r.y0 = min (y0, o.y0); - r.x1 = max (x1, o.x1); - r.y1 = max (y1, o.y1); - return r; -} - -Rect -Rect::expand (Distance amount) const -{ - Rect r; - r.x0 = x0 - amount; - r.y0 = y0 - amount; - r.x1 = safe_add (x1, amount); - r.y1 = safe_add (y1, amount); - return r; -} - -Rect -Rect::shrink (Distance amount) const -{ - /* This isn't the equivalent of expand (-distance) because - of the peculiarities of safe_add() with negative values. - Maybe. - */ - - Rect r; - - r.x0 = safe_add (x0, amount); - r.y0 = safe_add (y0, amount); - r.x1 = x1 - amount; - r.y1 = y1 - amount; - - return r; -} - -bool -Rect::contains (Duple point) const -{ - return point.x >= x0 && point.x <= x1 && point.y >= y0 && point.y <= y1; -} - -Rect -Rect::fix () const -{ - Rect r; - - r.x0 = min (x0, x1); - r.y0 = min (y0, y1); - r.x1 = max (x0, x1); - r.y1 = max (y0, y1); - - return r; -} - -bool -ArdourCanvas::operator!= (Rect const& a, Rect const& b) -{ - return a.x0 != b.x0 || - a.x1 != b.x1 || - a.y0 != b.y0 || - a.y1 != b.y1; -} - - -Duple -ArdourCanvas::operator- (Duple const & o) -{ - return Duple (-o.x, -o.y); -} - -Duple -ArdourCanvas::operator+ (Duple const & a, Duple const & b) -{ - return Duple (safe_add (a.x, b.x), safe_add (a.y, b.y)); -} - -bool -ArdourCanvas::operator== (Duple const & a, Duple const & b) -{ - return a.x == b.x && a.y == b.y; -} - -bool -ArdourCanvas::operator!= (Duple const & a, Duple const & b) -{ - return a.x != b.x || a.y != b.y; -} - -Duple -ArdourCanvas::operator- (Duple const & a, Duple const & b) -{ - return Duple (a.x - b.x, a.y - b.y); -} - -Duple -ArdourCanvas::operator/ (Duple const & a, double b) -{ - return Duple (a.x / b, a.y / b); -} - ostream & ArdourCanvas::operator<< (ostream & s, Duple const & r) { |