X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Farc.cc;h=49b3f63f0acfef6419d7eb6f2e3f8ecc20da641c;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hp=eeecd3204ae8c3ffa952fe9af61126d56f060057;hpb=75b933eadbe8f90a73a29bb207ff26eebcd4121a;p=ardour.git diff --git a/libs/canvas/arc.cc b/libs/canvas/arc.cc index eeecd3204a..49b3f63f0a 100644 --- a/libs/canvas/arc.cc +++ b/libs/canvas/arc.cc @@ -16,8 +16,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include #include + #include + #include "pbd/compose.h" #include "canvas/circle.h" #include "canvas/types.h" @@ -28,15 +31,20 @@ using namespace std; using namespace ArdourCanvas; -Arc::Arc (Group* parent) - : Item (parent) - , Outline (parent) - , Fill (parent) +Arc::Arc (Canvas* c) + : Item (c) , _radius (0.0) , _arc_degrees (0.0) , _start_degrees (0.0) { +} +Arc::Arc (Item* parent) + : Item (parent) + , _radius (0.0) + , _arc_degrees (0.0) + , _start_degrees (0.0) +{ } void @@ -47,7 +55,7 @@ Arc::compute_bounding_box () const /* this could be smaller in the case of small _arc values but I can't be bothered to optimize it. */ - + bbox.x0 = _center.x - _radius; bbox.y0 = _center.y - _radius; bbox.x1 = _center.x + _radius; @@ -65,7 +73,7 @@ Arc::render (Rect const & /*area*/, Cairo::RefPtr context) const if (_radius <= 0.0 || _arc_degrees <= 0.0) { return; } - + Duple c = item_to_window (Duple (_center.x, _center.y)); context->arc (c.x, c.y, _radius, _start_degrees * (M_PI/180.0), _arc_degrees * (M_PI/180.0)); @@ -90,34 +98,45 @@ void Arc::set_radius (Coord r) { begin_change (); - + _radius = r; _bounding_box_dirty = true; end_change (); -} - +} void Arc::set_arc (double deg) { begin_change (); - + _arc_degrees = deg; _bounding_box_dirty = true; end_change (); -} +} void Arc::set_start (double deg) { begin_change (); - + _start_degrees = deg; - + _bounding_box_dirty = true; end_change (); -} +} + +bool +Arc::covers (Duple const & point) const +{ + Duple p = window_to_item (point); + double angle_degs = atan (p.y/p.x) * 2.0 * M_PI; + double radius = sqrt (p.x * p.x + p.y * p.y); + + return (angle_degs >= _start_degrees) && + (angle_degs <= (_start_degrees + _arc_degrees)) && + (radius < _radius); +}