Home | History | Annotate | Download | only in agg23
      1 
      2 //----------------------------------------------------------------------------
      3 // Anti-Grain Geometry - Version 2.3
      4 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
      5 // Copyright (C) 2005 Tony Juricic (tonygeek (at) yahoo.com)
      6 //
      7 // Permission to copy, use, modify, sell and distribute this software
      8 // is granted provided this copyright notice appears in all copies.
      9 // This software is provided "as is" without express or implied
     10 // warranty, and with no claim as to its suitability for any purpose.
     11 //
     12 //----------------------------------------------------------------------------
     13 // Contact: mcseem (at) antigrain.com
     14 //          mcseemagg (at) yahoo.com
     15 //          http://www.antigrain.com
     16 //----------------------------------------------------------------------------
     17 #ifndef AGG_CURVES_INCLUDED
     18 #define AGG_CURVES_INCLUDED
     19 #include "agg_array.h"
     20 namespace agg
     21 {
     22 struct curve4_points : public CFX_Object {
     23     FX_FLOAT cp[8];
     24     curve4_points() {}
     25     curve4_points(FX_FLOAT x1, FX_FLOAT y1,
     26                   FX_FLOAT x2, FX_FLOAT y2,
     27                   FX_FLOAT x3, FX_FLOAT y3,
     28                   FX_FLOAT x4, FX_FLOAT y4)
     29     {
     30         cp[0] = x1;
     31         cp[1] = y1;
     32         cp[2] = x2;
     33         cp[3] = y2;
     34         cp[4] = x3;
     35         cp[5] = y3;
     36         cp[6] = x4;
     37         cp[7] = y4;
     38     }
     39     void init(FX_FLOAT x1, FX_FLOAT y1,
     40               FX_FLOAT x2, FX_FLOAT y2,
     41               FX_FLOAT x3, FX_FLOAT y3,
     42               FX_FLOAT x4, FX_FLOAT y4)
     43     {
     44         cp[0] = x1;
     45         cp[1] = y1;
     46         cp[2] = x2;
     47         cp[3] = y2;
     48         cp[4] = x3;
     49         cp[5] = y3;
     50         cp[6] = x4;
     51         cp[7] = y4;
     52     }
     53     FX_FLOAT  operator [] (unsigned i) const
     54     {
     55         return cp[i];
     56     }
     57     FX_FLOAT& operator [] (unsigned i)
     58     {
     59         return cp[i];
     60     }
     61 };
     62 class curve4_div : public CFX_Object
     63 {
     64 public:
     65     curve4_div() :
     66         m_cusp_limit(0),
     67         m_count(0)
     68     {}
     69     curve4_div(FX_FLOAT x1, FX_FLOAT y1,
     70                FX_FLOAT x2, FX_FLOAT y2,
     71                FX_FLOAT x3, FX_FLOAT y3,
     72                FX_FLOAT x4, FX_FLOAT y4) :
     73         m_cusp_limit(0),
     74         m_count(0)
     75     {
     76         init(x1, y1, x2, y2, x3, y3, x4, y4);
     77     }
     78     curve4_div(const curve4_points& cp) :
     79         m_count(0)
     80     {
     81         init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
     82     }
     83     void reset()
     84     {
     85         m_points.remove_all();
     86         m_count = 0;
     87     }
     88     void init(FX_FLOAT x1, FX_FLOAT y1,
     89               FX_FLOAT x2, FX_FLOAT y2,
     90               FX_FLOAT x3, FX_FLOAT y3,
     91               FX_FLOAT x4, FX_FLOAT y4);
     92     void init(const curve4_points& cp)
     93     {
     94         init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
     95     }
     96     void rewind(unsigned)
     97     {
     98         m_count = 0;
     99     }
    100     unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
    101     {
    102         if(m_count >= m_points.size()) {
    103             return path_cmd_stop;
    104         }
    105         const point_type& p = m_points[m_count++];
    106         *x = p.x;
    107         *y = p.y;
    108         return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
    109     }
    110     unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
    111     {
    112         if(m_count >= m_points.size()) {
    113             return path_cmd_stop;
    114         }
    115         const point_type& p = m_points[m_count++];
    116         *x = p.x;
    117         *y = p.y;
    118         flag = p.flag;
    119         return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
    120     }
    121     int count()
    122     {
    123         return m_points.size();
    124     }
    125 private:
    126     void bezier(FX_FLOAT x1, FX_FLOAT y1,
    127                 FX_FLOAT x2, FX_FLOAT y2,
    128                 FX_FLOAT x3, FX_FLOAT y3,
    129                 FX_FLOAT x4, FX_FLOAT y4);
    130     void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
    131                           FX_FLOAT x2, FX_FLOAT y2,
    132                           FX_FLOAT x3, FX_FLOAT y3,
    133                           FX_FLOAT x4, FX_FLOAT y4,
    134                           unsigned level);
    135     FX_FLOAT    m_distance_tolerance_square;
    136     FX_FLOAT    m_distance_tolerance_manhattan;
    137     FX_FLOAT    m_cusp_limit;
    138     unsigned              m_count;
    139     pod_deque<point_type> m_points;
    140 };
    141 class curve4 : public CFX_Object
    142 {
    143 public:
    144     curve4() {}
    145     curve4(FX_FLOAT x1, FX_FLOAT y1,
    146            FX_FLOAT x2, FX_FLOAT y2,
    147            FX_FLOAT x3, FX_FLOAT y3,
    148            FX_FLOAT x4, FX_FLOAT y4)
    149     {
    150         init(x1, y1, x2, y2, x3, y3, x4, y4);
    151     }
    152     curve4(const curve4_points& cp)
    153     {
    154         init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
    155     }
    156     void reset()
    157     {
    158         m_curve_div.reset();
    159     }
    160     void init(FX_FLOAT x1, FX_FLOAT y1,
    161               FX_FLOAT x2, FX_FLOAT y2,
    162               FX_FLOAT x3, FX_FLOAT y3,
    163               FX_FLOAT x4, FX_FLOAT y4)
    164     {
    165         m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);
    166     }
    167     void init(const curve4_points& cp)
    168     {
    169         init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
    170     }
    171     void rewind(unsigned path_id)
    172     {
    173         m_curve_div.rewind(path_id);
    174     }
    175     unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
    176     {
    177         return m_curve_div.vertex(x, y);
    178     }
    179     unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
    180     {
    181         return m_curve_div.vertex_flag(x, y, flag);
    182     }
    183     int count()
    184     {
    185         return m_curve_div.count();
    186     }
    187 private:
    188     curve4_div m_curve_div;
    189 };
    190 }
    191 #endif
    192