From 8482ce14ce6ce2a67cd95c0a1fcb7c6591caef35 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 18 Apr 2013 21:28:11 -0400 Subject: [PATCH] add Canvas::Arc and derive Canvas::Circle from it --- libs/canvas/arc.cc | 120 +++++++++++++++++++++++++++++++++++++++ libs/canvas/canvas/arc.h | 63 ++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 libs/canvas/arc.cc create mode 100644 libs/canvas/canvas/arc.h diff --git a/libs/canvas/arc.cc b/libs/canvas/arc.cc new file mode 100644 index 0000000000..c8eaf030e7 --- /dev/null +++ b/libs/canvas/arc.cc @@ -0,0 +1,120 @@ +/* + Copyright (C) 2013 Paul Davis + + 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 "pbd/compose.h" +#include "canvas/circle.h" +#include "canvas/types.h" +#include "canvas/debug.h" +#include "canvas/utils.h" +#include "canvas/canvas.h" + +using namespace std; +using namespace ArdourCanvas; + +Arc::Arc (Group* parent) + : Item (parent) + , Outline (parent) + , Fill (parent) + , _radius (0.0) + , _arc_degrees (0.0) + , _start_degrees (0.0) +{ + +} + +void +Arc::compute_bounding_box () const +{ + Rect bbox; + + /* 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; + bbox.y1 = _center.y + _radius; + + bbox = bbox.expand (0.5 + (_outline_width / 2)); + + _bounding_box = bbox; + _bounding_box_dirty = false; +} + +void +Arc::render (Rect const & /*area*/, Cairo::RefPtr context) const +{ + if (_radius <= 0.0 || _arc_degrees <= 0.0) { + return; + } + context->arc (_center.x, _center.y, _radius, _start_degrees * (M_PI/180.0), _arc_degrees * (M_PI/180.0)); + setup_fill_context (context); + context->fill_preserve (); + setup_outline_context (context); + context->stroke (); +} + +void +Arc::set_center (Duple const & c) +{ + begin_change (); + + _center = c; + + _bounding_box_dirty = true; + end_change (); +} + +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 (); +} + diff --git a/libs/canvas/canvas/arc.h b/libs/canvas/canvas/arc.h new file mode 100644 index 0000000000..fc1b72163e --- /dev/null +++ b/libs/canvas/canvas/arc.h @@ -0,0 +1,63 @@ +/* + Copyright (C) 2013 Paul Davis + + 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. +*/ + +#ifndef __CANVAS_ARC_H__ +#define __CANVAS_ARC_H__ + +#include "canvas/item.h" +#include "canvas/outline.h" +#include "canvas/fill.h" + +namespace ArdourCanvas { + +class Arc : virtual public Item, public Outline, public Fill +{ +public: + Arc (Group *); + + void render (Rect const & area, Cairo::RefPtr) const; + void compute_bounding_box () const; + + void set_center (Duple const &); + void set_radius (Coord); + void set_arc (double degrees); + void set_start (double degrees); + + Duple center() const { + return _center; + } + Coord radius () const { + return _radius; + } + double arc_degrees () const { + return _arc_degrees; + } + double start_degrees () const { + return _start_degrees; + } + +private: + Duple _center; + Coord _radius; + double _arc_degrees; + double _start_degrees; +}; + +} + +#endif