summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-12-02 05:32:34 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-12-02 05:32:34 -0500
commitdb3d42d5519c53f45721ffced7dce3b1dc032c16 (patch)
tree4101a95deb0656b8251802eb13cadd6282eca730 /libs
parentcf47d71761ec5b7539a4dce493e711387f442e43 (diff)
first pass at optimization for low-level canvas code
Diffstat (limited to 'libs')
-rw-r--r--libs/canvas/canvas/types.h104
-rw-r--r--libs/canvas/types.cc156
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)
{