1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
// mcseemagg@yahoo.com
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
// classes bezier_ctrl_impl, bezier_ctrl
//
//----------------------------------------------------------------------------
#ifndef AGG_BEZIER_CTRL_INCLUDED
#define AGG_BEZIER_CTRL_INCLUDED
#include "agg_math.h"
#include "agg_ellipse.h"
#include "agg_trans_affine.h"
#include "agg_color_rgba.h"
#include "agg_conv_stroke.h"
#include "agg_conv_curve.h"
#include "agg_polygon_ctrl.h"
namespace agg
{
//--------------------------------------------------------bezier_ctrl_impl
class bezier_ctrl_impl : public ctrl
{
public:
bezier_ctrl_impl();
void curve(double x1, double y1,
double x2, double y2,
double x3, double y3,
double x4, double y4);
curve4& curve();
double x1() const { return m_poly.xn(0); }
double y1() const { return m_poly.yn(0); }
double x2() const { return m_poly.xn(1); }
double y2() const { return m_poly.yn(1); }
double x3() const { return m_poly.xn(2); }
double y3() const { return m_poly.yn(2); }
double x4() const { return m_poly.xn(3); }
double y4() const { return m_poly.yn(3); }
void x1(double x) { m_poly.xn(0) = x; }
void y1(double y) { m_poly.yn(0) = y; }
void x2(double x) { m_poly.xn(1) = x; }
void y2(double y) { m_poly.yn(1) = y; }
void x3(double x) { m_poly.xn(2) = x; }
void y3(double y) { m_poly.yn(2) = y; }
void x4(double x) { m_poly.xn(3) = x; }
void y4(double y) { m_poly.yn(3) = y; }
void line_width(double w) { m_stroke.width(w); }
double line_width() const { return m_stroke.width(); }
void point_radius(double r) { m_poly.point_radius(r); }
double point_radius() const { return m_poly.point_radius(); }
virtual bool in_rect(double x, double y) const;
virtual bool on_mouse_button_down(double x, double y);
virtual bool on_mouse_button_up(double x, double y);
virtual bool on_mouse_move(double x, double y, bool button_flag);
virtual bool on_arrow_keys(bool left, bool right, bool down, bool up);
// Vertex source interface
unsigned num_paths() { return 7; };
void rewind(unsigned path_id);
unsigned vertex(double* x, double* y);
private:
curve4 m_curve;
ellipse m_ellipse;
conv_stroke<curve4> m_stroke;
polygon_ctrl_impl m_poly;
unsigned m_idx;
};
//----------------------------------------------------------bezier_ctrl
template<class ColorT> class bezier_ctrl : public bezier_ctrl_impl
{
public:
bezier_ctrl() :
m_color(rgba(0.0, 0.0, 0.0))
{
}
void line_color(const ColorT& c) { m_color = c; }
const ColorT& color(unsigned i) const { return m_color; }
private:
bezier_ctrl(const bezier_ctrl<ColorT>&);
const bezier_ctrl<ColorT>& operator = (const bezier_ctrl<ColorT>&);
ColorT m_color;
};
//--------------------------------------------------------curve3_ctrl_impl
class curve3_ctrl_impl : public ctrl
{
public:
curve3_ctrl_impl();
void curve(double x1, double y1,
double x2, double y2,
double x3, double y3);
curve3& curve();
double x1() const { return m_poly.xn(0); }
double y1() const { return m_poly.yn(0); }
double x2() const { return m_poly.xn(1); }
double y2() const { return m_poly.yn(1); }
double x3() const { return m_poly.xn(2); }
double y3() const { return m_poly.yn(2); }
void x1(double x) { m_poly.xn(0) = x; }
void y1(double y) { m_poly.yn(0) = y; }
void x2(double x) { m_poly.xn(1) = x; }
void y2(double y) { m_poly.yn(1) = y; }
void x3(double x) { m_poly.xn(2) = x; }
void y3(double y) { m_poly.yn(2) = y; }
void line_width(double w) { m_stroke.width(w); }
double line_width() const { return m_stroke.width(); }
void point_radius(double r) { m_poly.point_radius(r); }
double point_radius() const { return m_poly.point_radius(); }
virtual bool in_rect(double x, double y) const;
virtual bool on_mouse_button_down(double x, double y);
virtual bool on_mouse_button_up(double x, double y);
virtual bool on_mouse_move(double x, double y, bool button_flag);
virtual bool on_arrow_keys(bool left, bool right, bool down, bool up);
// Vertex source interface
unsigned num_paths() { return 6; };
void rewind(unsigned path_id);
unsigned vertex(double* x, double* y);
private:
curve3 m_curve;
ellipse m_ellipse;
conv_stroke<curve3> m_stroke;
polygon_ctrl_impl m_poly;
unsigned m_idx;
};
//----------------------------------------------------------curve3_ctrl
template<class ColorT> class curve3_ctrl : public curve3_ctrl_impl
{
public:
curve3_ctrl() :
m_color(rgba(0.0, 0.0, 0.0))
{
}
void line_color(const ColorT& c) { m_color = c; }
const ColorT& color(unsigned i) const { return m_color; }
private:
curve3_ctrl(const curve3_ctrl<ColorT>&);
const curve3_ctrl<ColorT>& operator = (const curve3_ctrl<ColorT>&);
ColorT m_color;
};
}
#endif
|