From 5bb213f53b9a768a955fa16898a9254b0ca66429 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 18 Apr 2013 15:47:30 -0400 Subject: [PATCH] add Canvas::Circle --- libs/canvas/canvas/circle.h | 53 ++++++++++++++++++++++ libs/canvas/circle.cc | 90 +++++++++++++++++++++++++++++++++++++ libs/canvas/wscript | 1 + 3 files changed, 144 insertions(+) create mode 100644 libs/canvas/canvas/circle.h create mode 100644 libs/canvas/circle.cc diff --git a/libs/canvas/canvas/circle.h b/libs/canvas/canvas/circle.h new file mode 100644 index 0000000000..4cf775db0b --- /dev/null +++ b/libs/canvas/canvas/circle.h @@ -0,0 +1,53 @@ +/* + 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_CIRCLE_H__ +#define __CANVAS_CIRCLE_H__ + +#include "canvas/item.h" +#include "canvas/outline.h" +#include "canvas/fill.h" + +namespace ArdourCanvas { + +class Circle : virtual public Item, public Outline, public Fill +{ +public: + Circle (Group *); + + void render (Rect const & area, Cairo::RefPtr) const; + void compute_bounding_box () const; + + void set_center (Duple const &); + void set_radius (Coord); + + Duple center() const { + return _center; + } + Coord radius () const { + return _radius; + } + +private: + Duple _center; + Coord _radius; +}; + +} + +#endif diff --git a/libs/canvas/circle.cc b/libs/canvas/circle.cc new file mode 100644 index 0000000000..3a3d6e8e7e --- /dev/null +++ b/libs/canvas/circle.cc @@ -0,0 +1,90 @@ +/* + 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; + +Circle::Circle (Group* parent) + : Item (parent) + , Outline (parent) + , Fill (parent) + , _radius (0.0) +{ + +} + +void +Circle::compute_bounding_box () const +{ + Rect bbox; + + 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 +Circle::render (Rect const & /*area*/, Cairo::RefPtr context) const +{ + if (_radius <= 0.0) { + return; + } + context->arc (_center.x, _center.y, _radius, 0.0, 2.0 * M_PI); + setup_fill_context (context); + context->fill_preserve (); + setup_outline_context (context); + context->stroke (); +} + +void +Circle::set_center (Duple const & c) +{ + begin_change (); + + _center = c; + + _bounding_box_dirty = true; + end_change (); +} + +void +Circle::set_radius (Coord r) +{ + begin_change (); + + _radius = r; + + _bounding_box_dirty = true; + end_change (); +} + diff --git a/libs/canvas/wscript b/libs/canvas/wscript index 177328115c..ba75162eae 100644 --- a/libs/canvas/wscript +++ b/libs/canvas/wscript @@ -30,6 +30,7 @@ path_prefix = 'libs/canvas/' canvas_sources = [ 'arrow.cc', 'canvas.cc', + 'circle.cc', 'curve.cc', 'debug.cc', 'item.cc',