btrfs: [] on the end of a struct field is a variable length array.
[haiku.git] / headers / libs / agg / agg_rasterizer_outline.h
blobcc2bd2f744fcd50e8f289185558b1f554672b9a9
1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4 //
5 // Permission to copy, use, modify, sell and distribute this software
6 // is granted provided this copyright notice appears in all copies.
7 // This software is provided "as is" without express or implied
8 // warranty, and with no claim as to its suitability for any purpose.
9 //
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
15 #ifndef AGG_RASTERIZER_OUTLINE_INCLUDED
16 #define AGG_RASTERIZER_OUTLINE_INCLUDED
18 #include "agg_basics.h"
20 namespace agg
22 //======================================================rasterizer_outline
23 template<class Renderer> class rasterizer_outline
25 public:
26 rasterizer_outline(Renderer& ren) :
27 m_ren(&ren),
28 m_start_x(0),
29 m_start_y(0),
30 m_vertices(0)
32 void attach(Renderer& ren) { m_ren = &ren; }
35 //--------------------------------------------------------------------
36 void move_to(int x, int y)
38 m_vertices = 1;
39 m_ren->move_to(m_start_x = x, m_start_y = y);
42 //--------------------------------------------------------------------
43 void line_to(int x, int y)
45 ++m_vertices;
46 m_ren->line_to(x, y);
49 //--------------------------------------------------------------------
50 void move_to_d(double x, double y)
52 move_to(m_ren->coord(x), m_ren->coord(y));
55 //--------------------------------------------------------------------
56 void line_to_d(double x, double y)
58 line_to(m_ren->coord(x), m_ren->coord(y));
61 //--------------------------------------------------------------------
62 void close()
64 if(m_vertices > 2)
66 line_to(m_start_x, m_start_y);
68 m_vertices = 0;
71 //--------------------------------------------------------------------
72 void add_vertex(double x, double y, unsigned cmd)
74 if(is_move_to(cmd))
76 move_to_d(x, y);
78 else
80 if(is_end_poly(cmd))
82 if(is_closed(cmd)) close();
84 else
86 line_to_d(x, y);
92 //--------------------------------------------------------------------
93 template<class VertexSource>
94 void add_path(VertexSource& vs, unsigned path_id=0)
96 double x;
97 double y;
99 unsigned cmd;
100 vs.rewind(path_id);
101 while(!is_stop(cmd = vs.vertex(&x, &y)))
103 add_vertex(x, y, cmd);
108 //--------------------------------------------------------------------
109 template<class VertexSource, class ColorStorage, class PathId>
110 void render_all_paths(VertexSource& vs,
111 const ColorStorage& colors,
112 const PathId& path_id,
113 unsigned num_paths)
115 for(unsigned i = 0; i < num_paths; i++)
117 m_ren->line_color(colors[i]);
118 add_path(vs, path_id[i]);
123 //--------------------------------------------------------------------
124 template<class Ctrl> void render_ctrl(Ctrl& c)
126 unsigned i;
127 for(i = 0; i < c.num_paths(); i++)
129 m_ren->line_color(c.color(i));
130 add_path(c, i);
135 private:
136 Renderer* m_ren;
137 int m_start_x;
138 int m_start_y;
139 unsigned m_vertices;
146 #endif