X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fcanvas%2Ftypes.cc;h=a8c690bbbe85e2a9bea8cbc7af143f82a3cb0807;hb=a1f858d3b207739e0719c1fc28003f1d9dd3965d;hp=02ab77e00090c3bf6b6bfed9d56d18cf663ff195;hpb=aaea166135ace01709f7e0be64f40be80f4107ec;p=ardour.git diff --git a/libs/canvas/types.cc b/libs/canvas/types.cc index 02ab77e000..a8c690bbbe 100644 --- a/libs/canvas/types.cc +++ b/libs/canvas/types.cc @@ -1,19 +1,39 @@ +/* + Copyright (C) 2011-2013 Paul Davis + Author: Carl Hetherington + + 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 #include #include + +#include + #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; } @@ -52,7 +72,7 @@ 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); @@ -101,6 +121,39 @@ Rect::fix () const return r; } +Rect +Rect::convert_to_device (Cairo::RefPtr c) const +{ + Coord xa, ya, xb, yb; + + xa = x0; + xb = x1; + ya = y0; + yb = y1; + + c->user_to_device (xa, ya); + c->user_to_device (xb, yb); + + return Rect (xa, ya, xb, yb); +} + + +Rect +Rect::convert_to_user (Cairo::RefPtr c) const +{ + Coord xa, ya, xb, yb; + + xa = x0; + xb = x1; + ya = y0; + yb = y1; + + c->device_to_user (xa, ya); + c->device_to_user (xb, yb); + + return Rect (xa, ya, xb, yb); +} + Duple ArdourCanvas::operator- (Duple const & o) { @@ -113,6 +166,12 @@ 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; +} + Duple ArdourCanvas::operator- (Duple const & a, Duple const & b) { @@ -135,7 +194,7 @@ ArdourCanvas::operator<< (ostream & s, Duple const & r) 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; }