+/*
+ Copyright (C) 2011-2013 Paul Davis
+ Author: Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
#include <algorithm>
#include <cfloat>
#include <cassert>
+
+#include <cairomm/context.h>
+
#include "canvas/types.h"
using namespace std;
using namespace ArdourCanvas;
-Coord const ArdourCanvas::COORD_MAX = DBL_MAX;
-/* XXX: empirically arrived at */
-Coord const ArdourCanvas::CAIRO_MAX = 65536;
+Coord const ArdourCanvas::COORD_MAX = 1.7e307;
-Coord
-ArdourCanvas::safe_add (Coord a, Coord b)
+static inline Coord
+safe_add (Coord a, Coord b)
{
- if (a == COORD_MAX || b == COORD_MAX) {
+ if (((COORD_MAX - a) <= b) || ((COORD_MAX - b) <= a)) {
return COORD_MAX;
}
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);
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 (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)
{
ostream &
ArdourCanvas::operator<< (ostream & s, Rect const & r)
{
- s << "[(" << r.x0 << ", " << r.y0 << "), (" << r.x1 << ", " << r.y1 << ")]";
+ s << "[(" << r.x0 << ", " << r.y0 << "), (" << r.x1 << ", " << r.y1 << ") " << r.width() << " x " << r.height() << "]";
return s;
}