wxArt2D
aggdrawer.h
Go to the documentation of this file.
1 /*! \file wx/aggdrawer/aggdrawer.h
2 
3  \brief the antigrain based drawing context derived from a2dDrawer2D
4 
5  This drawing context does anti aliased and alpha drawing. And uses a wxImage as a buffer.
6  A strong feature is the ability to draw (rotated) wxImage's
7 
8  \author Klaas Holwerda
9 
10  Copyright: 2000-2004 (c) Klaas Holwerda
11 
12  Licence: wxWidgets Licence
13 
14  RCS-ID: $Id: aggdrawer.h,v 1.43 2009/10/06 18:40:31 titato Exp $
15 */
16 
17 #ifndef __WXAGGDRAWER_H__
18 #define __WXAGGDRAWER_H__
19 
20 #ifndef WX_PRECOMP
21 #include "wx/wx.h"
22 #endif
23 
24 // where we keep all our configuration symbol (wxART2D_USE_*)
25 #include "a2dprivate.h"
26 
27 #if wxART2D_USE_AGGDRAWER
28 
29 #include "wx/artbase/drawer2d.h"
30 #include "agg_basics.h"
31 #include "agg_rendering_buffer.h"
32 #include "agg_rasterizer_scanline_aa.h"
33 #include "agg_scanline_u.h"
34 #include "agg_path_storage.h"
35 #include "agg_conv_stroke.h"
36 #include "wx/image.h"
37 #include "wx/geometry.h"
38 
39 #include "agg_pixfmt_rgb.h"
40 #include "agg_pixfmt_rgba.h"
41 #include "agg_image_accessors.h"
42 #include "agg_span_allocator.h"
43 #include "agg_conv_dash.h"
44 #include "agg_pixfmt_rgba.h"
45 #include "agg_span_image_filter_rgba.h"
46 //#include "agg_affine_matrix.h"
47 #include "agg_rendering_buffer.h"
48 #include "agg_rasterizer_scanline_aa.h"
49 #include "agg_renderer_outline_aa.h"
50 #include "agg_rasterizer_outline_aa.h"
51 #include "agg_conv_transform.h"
52 #include "agg_bspline.h"
53 #include "agg_gsv_text.h"
54 #include "agg_scanline_p.h"
55 #include "agg_renderer_scanline.h"
56 #include "agg_renderer_mclip.h"
57 
58 #include "agg_conv_stroke.h"
59 #include "agg_conv_dash.h"
60 #include "agg_conv_curve.h"
61 #include "agg_conv_contour.h"
62 #include "agg_conv_smooth_poly1.h"
63 #include "agg_conv_marker.h"
64 #include "agg_arrowhead.h"
65 #include "agg_vcgen_markers_term.h"
66 #include "agg_rendering_buffer.h"
67 #include "agg_arc.h"
68 #include "agg_ellipse.h"
69 #include "agg_rounded_rect.h"
70 #include "agg_path_storage.h"
71 #include "agg_span_pattern_rgb.h"
72 #include "agg_trans_affine.h"
73 #include "agg_span_image_filter_rgb.h"
74 #include "agg_span_gradient.h"
75 #include "agg_span_interpolator_linear.h"
76 #include "agg_span_converter.h"
77 
78 #ifdef A2DAGGDRAWERMAKINGDLL
79 #define A2DAGGDRAWERDLLEXP WXEXPORT
80 #define A2DAGGDRAWERDLLEXP_DATA(type) WXEXPORT type
81 #define A2DAGGDRAWERDLLEXP_CTORFN
82 #elif defined(WXART2D_USINGDLL)
83 #define A2DAGGDRAWERDLLEXP WXIMPORT
84 #define A2DAGGDRAWERDLLEXP_DATA(type) WXIMPORT type
85 #define A2DAGGDRAWERDLLEXP_CTORFN
86 #else // not making nor using DLL
87 #define A2DAGGDRAWERDLLEXP
88 #define A2DAGGDRAWERDLLEXP_DATA(type) type
89 #define A2DAGGDRAWERDLLEXP_CTORFN
90 #endif
91 
92 #if defined(WXART2D_USINGDLL)
93 template struct A2DAGGDRAWERDLLEXP agg::rect_base<int>;
94 
95 template class A2DAGGDRAWERDLLEXP agg::pod_array<agg::int8u*>;
96 template class A2DAGGDRAWERDLLEXP agg::row_ptr_cache<agg::int8u>;
97 
98 template class A2DAGGDRAWERDLLEXP agg::rasterizer_sl_clip<agg::ras_conv_int>;
99 template class A2DAGGDRAWERDLLEXP agg::pod_vector<agg::rasterizer_cells_aa<agg::cell_aa>::cell_type*>;
100 template class A2DAGGDRAWERDLLEXP agg::pod_vector<agg::rasterizer_cells_aa<agg::cell_aa>::sorted_y>;
101 template class A2DAGGDRAWERDLLEXP agg::rasterizer_cells_aa<agg::cell_aa>;
102 template class A2DAGGDRAWERDLLEXP agg::rasterizer_scanline_aa<>;
103 
104 template class A2DAGGDRAWERDLLEXP agg::row_accessor<agg::int8u>;
105 
106 class A2DAGGDRAWERDLLEXP agg::scanline_u8;
107 #endif
108 
109 typedef agg::order_rgba wxImageComponentOrder;
110 
111 //! color format in a2dAggDrawer
112 typedef agg::rgba8 color_type;
113 typedef agg::pixfmt_rgb24 PixFormat;
114 typedef agg::blender_rgba<color_type, wxImageComponentOrder> Blender;
115 //! base rendering Agg
116 typedef agg::renderer_base<PixFormat> RendererBase;
117 //! solid rendering on top of base rendering Agg
118 typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolidAa;
119 // or this one for non aliased, but still alpha, 4 times faster
120 typedef agg::renderer_scanline_bin_solid<RendererBase> RendererSolidBin;
121 
122 typedef agg::renderer_outline_aa<RendererBase> RendererOutlineAa;
123 typedef agg::rasterizer_outline_aa<RendererOutlineAa> RasterOutLineAa;
124 
125 #include "agg_pixfmt_rgba.h"
126 
127 //! color format in a2dAggDrawer
128 #if defined(__WXMSW__)
129 typedef agg::pixfmt_bgra32 PixFormatA;
130 typedef agg::order_bgra ComponentOrder; // Platform dependent!
131 #else
132 typedef agg::pixfmt_rgba32 PixFormatA;
133 typedef agg::order_rgba ComponentOrder; // Platform dependent!
134 #endif
135 typedef agg::comp_op_adaptor_rgba<color_type, ComponentOrder> BlenderCompA;
136 typedef agg::pixfmt_custom_blend_rgba<BlenderCompA, agg::rendering_buffer> PixFormatComp;
137 //! base rendering Agg
138 typedef agg::renderer_base<PixFormatA> RendererBaseA;
139 typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
140 //! solid rendering on top of base rendering Agg
141 typedef agg::renderer_scanline_aa_solid<RendererBaseA> RendererSolidAaA;
142 typedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;
143 // or this one for non aliased, but still alpha, 4 times faster
144 typedef agg::renderer_scanline_bin_solid<RendererBase> RendererSolidBin;
145 
146 typedef agg::renderer_outline_aa<RendererBaseA> RendererOutlineAaA;
147 typedef agg::rasterizer_outline_aa<RendererOutlineAaA> RasterOutLineAaA;
148 
149 typedef agg::pod_auto_array<color_type, 256> GradientArray;
150 
151 typedef agg::span_gradient<color_type, agg::span_interpolator_linear<>, agg::gradient_x, GradientArray> LinearGradientSpan;
152 typedef agg::span_gradient<color_type, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;
153 
154 typedef agg::span_allocator<agg::rgba8> span_allocator_type;
155 
156 typedef agg::renderer_scanline_aa < RendererBase,
157  span_allocator_type,
158  LinearGradientSpan > RendererLinearGradient;
159 typedef agg::renderer_scanline_aa < RendererBase,
160  span_allocator_type,
161  RadialGradientSpan > RendererRadialGradient;
162 
163 typedef agg::renderer_scanline_aa < RendererBaseA,
164  span_allocator_type,
165  LinearGradientSpan > RendererLinearGradientA;
166 typedef agg::renderer_scanline_aa < RendererBaseA,
167  span_allocator_type,
168  RadialGradientSpan > RendererRadialGradientA;
169 
170 typedef agg::renderer_scanline_aa < RendererBaseComp,
171  span_allocator_type,
172  LinearGradientSpan > RendererLinearGradientComp;
173 typedef agg::renderer_scanline_aa < RendererBaseComp,
174  span_allocator_type,
175  RadialGradientSpan > RendererRadialGradientComp;
176 
177 static const char* HORIZONTAL_HATCH_XPM[] =
178 {
179  "32 32 2 1 0 0",
180  " c #000000",
181  "! c #FFFFFF",
182  " ",
183  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
184  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
185  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
186  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
187  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
188  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
189  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
190  " ",
191  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
192  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
193  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
194  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
195  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
196  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
197  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
198  " ",
199  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
200  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
201  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
202  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
203  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
204  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
205  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
206  " ",
207  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
208  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
209  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
210  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
211  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
212  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
213  "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
214 };
215 
216 static const char* VERTICAL_HATCH_XPM[] =
217 {
218  "32 32 2 1 0 0",
219  " c #000000",
220  "! c #FFFFFF",
221  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
222  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
223  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
224  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
225  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
226  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
227  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
228  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
229  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
230  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
231  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
232  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
233  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
234  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
235  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
236  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
237  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
238  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
239  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
240  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
241  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
242  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
243  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
244  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
245  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
246  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
247  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
248  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
249  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
250  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
251  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
252  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!"
253 };
254 
255 static const char* FDIAGONAL_HATCH_XPM[] =
256 {
257  "32 32 2 1 0 0",
258  " c #000000",
259  "! c #FFFFFF",
260  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
261  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
262  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
263  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
264  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
265  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
266  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
267  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
268  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
269  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
270  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
271  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
272  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
273  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
274  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
275  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
276  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
277  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
278  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
279  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
280  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
281  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
282  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
283  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
284  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
285  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
286  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
287  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
288  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
289  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
290  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
291  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! "
292 };
293 
294 static const char* BDIAGONAL_HATCH_XPM[] =
295 {
296  "32 32 2 1 0 0",
297  " c #000000",
298  "! c #FFFFFF",
299  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
300  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
301  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
302  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
303  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
304  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
305  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
306  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
307  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
308  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
309  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
310  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
311  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
312  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
313  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
314  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
315  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
316  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
317  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
318  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
319  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
320  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
321  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
322  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
323  "!!!!!!! !!!!!!! !!!!!!! !!!!!!! ",
324  "!!!!!! !!!!!!! !!!!!!! !!!!!!! !",
325  "!!!!! !!!!!!! !!!!!!! !!!!!!! !!",
326  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
327  "!!! !!!!!!! !!!!!!! !!!!!!! !!!!",
328  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
329  "! !!!!!!! !!!!!!! !!!!!!! !!!!!!",
330  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!"
331 };
332 
333 static const char* CROSSDIAG_HATCH_XPM[] =
334 {
335  "32 32 2 1 0 0",
336  " c #000000",
337  "! c #FFFFFF",
338  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
339  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
340  "!! !!! !!! !!! !!! !!! !!! !!! !",
341  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
342  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
343  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
344  "!! !!! !!! !!! !!! !!! !!! !!! !",
345  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
346  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
347  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
348  "!! !!! !!! !!! !!! !!! !!! !!! !",
349  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
350  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
351  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
352  "!! !!! !!! !!! !!! !!! !!! !!! !",
353  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
354  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
355  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
356  "!! !!! !!! !!! !!! !!! !!! !!! !",
357  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
358  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
359  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
360  "!! !!! !!! !!! !!! !!! !!! !!! !",
361  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
362  " !!!!!!! !!!!!!! !!!!!!! !!!!!!!",
363  "! !!!!! ! !!!!! ! !!!!! ! !!!!! ",
364  "!! !!! !!! !!! !!! !!! !!! !!! !",
365  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
366  "!!!! !!!!!!! !!!!!!! !!!!!!! !!!",
367  "!!! ! !!!!! ! !!!!! ! !!!!! ! !!",
368  "!! !!! !!! !!! !!! !!! !!! !!! !",
369  "! !!!!! ! !!!!! ! !!!!! ! !!!!! "
370 };
371 
372 static const char* CROSS_HATCH_XPM[] =
373 {
374  "32 32 2 1 0 0",
375  " c #000000",
376  "! c #FFFFFF",
377  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
378  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
379  " ",
380  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
381  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
382  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
383  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
384  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
385  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
386  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
387  " ",
388  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
389  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
390  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
391  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
392  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
393  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
394  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
395  " ",
396  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
397  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
398  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
399  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
400  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
401  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
402  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
403  " ",
404  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
405  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
406  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
407  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!",
408  "!! !!!!!!! !!!!!!! !!!!!!! !!!!!"
409 };
410 
411 typedef agg::rasterizer_scanline_aa<> RasterizerType;
412 typedef RendererSolidAa RendererType;
413 // Non Aliased drawing, not that good, but you can try it.
414 //typedef RendererSolidBin RendererType;
415 
416 
417 /*
418 noop_conv_transform: this is a small helper class that can stand in for an
419 agg::conv_transform. It introduces little overhead (and possibly none after
420 compiler optimizations), but allows us to consolidate the code for processing
421 paths into strokes in one place.
422 */
423 template<class VertexSource> class noop_conv_transform
424 {
425 public:
426  noop_conv_transform( VertexSource& source, int ) : m_source( source ) {}
427 
428  void rewind( unsigned path_id )
429  {
430  m_source.rewind( path_id );
431  }
432 
433  unsigned vertex( double* x, double* y )
434  {
435  return m_source.vertex( x, y );
436  }
437 
438  void transformer( void* ) {}
439 
440 private:
443  operator = ( const noop_conv_transform<VertexSource>& );
444  VertexSource& m_source;
445 };
446 
447 class A2DAGGDRAWERDLLEXP a2dAggDrawerBase : public a2dDrawer2D
448 {
449 
450 public:
451 
452  a2dAggDrawerBase( int width = 0, int height = 0 );
453 
454  //! Drawer having a buffer of w pixel wide and h pixels height given by size
455  a2dAggDrawerBase( const wxSize& size );
456 
457  //! bitmap is converted to image on which you can draw.
458  //! Use GetBuffer() to get a bitmap back.
459  a2dAggDrawerBase( const wxBitmap& bitmap );
460 
461  //! copy constructor
462  a2dAggDrawerBase( const a2dAggDrawerBase& other );
463 
464  bool HasAlpha() { return true; }
465 
466  void SetPreStroke( bool preStroke ) { m_preStroke = preStroke; }
467 
468  bool GetPreStroke() { return m_preStroke; }
469 
470  void ResetStyle();
471 
472  void SetClippingRegion( a2dVertexList* points, bool spline = false, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
473 
474  virtual void ExtendClippingRegion( a2dVertexList* points, bool spline = false, wxPolygonFillMode fillStyle = wxODDEVEN_RULE, a2dBooleanClip clipoperation = a2dCLIP_AND );
475 
476  virtual void ExtendAndPushClippingRegion( a2dVertexList* points, bool spline = false, wxPolygonFillMode fillStyle = wxODDEVEN_RULE, a2dBooleanClip clipoperation = a2dCLIP_AND );
477 
478  void PopClippingRegion();
479 
480  void SetClippingRegionDev( wxCoord minx, wxCoord miny, wxCoord width, wxCoord height );
481 
482  void SetClippingRegion( double minx, double miny, double maxx, double maxy );
483 
484  void DestroyClippingRegion();
485 
486  void BlitBuffer( wxRect rect, const wxPoint& bufferpos = wxPoint( 0, 0 ) );
487 
488  void BlitBuffer( wxDC* dc, wxRect rect, const wxPoint& bufferpos = wxPoint( 0, 0 ) ) = 0;
489 
490  virtual void DrawCircle( double x, double y, double radius );
491 
492  void DrawPoint( double xc, double yc );
493 
494  //!start to draw on this context (used to initialize a specific drawer)
495  virtual void BeginDraw();
496 
497  //!end drawing on this context (used to reset a specific drawer)
498  virtual void EndDraw();
499 
500  wxDC* GetDeviceDC() const { return m_deviceDC; }
501 
502  virtual void DrawRoundedRectangle( double x, double y, double width, double height, double radius, bool pixelsize = false );
503 
504  virtual void DrawEllipse( double x, double y, double width, double height );
505 
506  //!Draw polygon in world coordinates using pointarray
507  virtual void DrawPolygon( a2dVertexArray* points, bool spline = false, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
508 
509  //!Draw polygon in world coordinates using pointlist
510  virtual void DrawPolygon( const a2dVertexList* list, bool spline = false, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
511 
512  //! draw a list of polygons ( contour clockwise becomes hole )
513  virtual void DrawPolyPolygon( a2dListOfa2dVertexList polylist, wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
514 
515  //!Draw polyline in world coordinates using pointarray
516  virtual void DrawLines( a2dVertexArray* points, bool spline = false );
517 
518  //!Draw polyline in world coordinates using pointlist
519  virtual void DrawLines( const a2dVertexList* list, bool spline = false );
520 
521 protected:
522 
523  // Documented in base class
524  virtual void DrawCharDc( wxChar c );
525  // Documented in base class
526  virtual void DrawCharStroke( wxChar c );
527  // Documented in base class
528  virtual void DrawCharFreetype( wxChar c );
529 
530  void ShiftBufferInternal( int dxy, bool yshift, int bytesPerPixel );
531 
532  template <class PathT>
533  void _ras_add_stroked_path_xform( PathT& path, const agg::trans_affine& mtx );
534 
535  virtual void Render( bool fillColor ) = 0;
536  virtual void RenderGradient( bool radial ) = 0;
537  virtual void RenderBitmapFill() = 0;
538  virtual void RenderSetClip() = 0;
539 
540  agg::trans_affine _get_agg_user_to_device_transform() const;
541 
542  void DoSetDrawStyle( a2dDrawStyle drawstyle );
543 
544  void DoSetActiveStroke();
545 
546  void DoSetActiveFill();
547 
548  int ToAggPath( a2dVertexArray* points, bool transform );
549  int ToAggPath( const a2dVertexList* list, bool transform );
550 
551  bool m_preStroke;
552 
553  wxRegion m_clip;
554 
555  wxClientDC* m_deviceDC;
556 
557  bool m_ownsBuffer;
558 
559  RasterizerType m_rasterizer;
560  agg::comp_op_e m_blendMode;
561 
562  double m_strokewidth;
563  double m_strokewidthDev;
564  a2dStrokeStyle m_style;
565 
566  agg::line_join_e m_join;
567 
568  agg::line_cap_e m_cap;
569 
570  wxImage m_pattern;
571  agg::rendering_buffer m_pattern_rbuf;
572 
573  agg::scanline_u8 m_sl;
574 
575  agg::path_storage m_path;
576 
577  double m_fillGradientD1;
578  double m_lineGradientD1;
579  double m_fillGradientD2;
580  double m_lineGradientD2;
581  GradientArray m_fillGradient;
582  GradientArray m_lineGradient;
583  agg::trans_affine m_fillGradientMatrix;
584  agg::trans_affine m_lineGradientMatrix;
585  agg::span_interpolator_linear<> m_fillGradientInterpolator;
586  agg::span_interpolator_linear<> m_lineGradientInterpolator;
587 
588  agg::gradient_x m_linearGradientFunction;
589  agg::gradient_circle m_radialGradientFunction;
590 
591  unsigned char* m_pdata;
592 };
593 
594 //! the antigrain based drawing context derived from a2dDrawer2D
595 /*!
596  This drawing context does anti aliased and alpha drawing. And uses a wxImage as a buffer.
597  A strong feature is the ability to draw (rotated) wxImage's
598 
599  \ingroup drawer
600 */
601 class A2DAGGDRAWERDLLEXP a2dAggDrawer : public a2dAggDrawerBase
602 {
603  DECLARE_DYNAMIC_CLASS( a2dAggDrawer )
604 
605 public:
606 
607  //! Drawer having a buffer of w pixel wide and h pixels heigh
608  a2dAggDrawer( int width = 0, int height = 0 );
609 
610  //! Drawer having a buffer of w pixel wide and h pixels height given by size
611  a2dAggDrawer( const wxSize& size );
612 
613  //! bitmap is converted to image on which you can draw.
614  //! Use GetBuffer() to get a bitmap back.
615  a2dAggDrawer( const wxBitmap& bitmap );
616 
617  //! copy constructor
618  a2dAggDrawer( const a2dAggDrawer& other );
619 
620  //!get buffer as bitmap pointer
621  wxBitmap GetBuffer() const;
622 
623  //! return wxImage which is used as buffer here
624  wxImage& GetImageBuffer() { return m_buffer; }
625 
626  //!set buffer size to w pixel wide and h pixels heigh
627  void SetBufferSize( int w, int h );
628 
629  //!get part of the buffer given a rect
630  wxBitmap GetSubBitmap( wxRect sub_rect ) const;
631 
632  void CopyIntoBuffer( const wxBitmap& bitm );
633 
634  virtual ~a2dAggDrawer();
635 
636  void BlitBuffer( wxDC* dc, wxRect rect, const wxPoint& bufferpos = wxPoint( 0, 0 ) );
637 
638  void ShiftBuffer( int dxy, bool yshift );
639 
640  void DrawImage( const wxImage& image, double x, double y, double width, double height, wxUint8 Opacity = 255 );
641 
642  void DrawImage( const a2dImageRGBA& image, double x, double y, double width, double height, wxUint8 Opacity = 255 );
643 
644 protected:
645 
646  void DeviceDrawPixel( int x1, int y1, unsigned char r, unsigned char g, unsigned char b, unsigned char a );
647 
648  void Render( bool fillColor );
649  virtual void RenderGradient( bool radial );
650  virtual void RenderBitmapFill();
651  virtual void RenderSetClip();
652 
653  wxImage m_buffer;
654 
655  bool m_needbufferupdate;
656 
657 private:
658 
659  PixFormat m_pixFormat;
660  RendererBase m_renBase;
661  RendererType m_renderer;
662 
663  agg::rendering_buffer m_rendering_buffer;
664 
665 };
666 
667 //! the antigrain based drawing context derived from a2dDrawer2D
668 /*!
669  This drawing context does anti aliased and alpha drawing. And uses a a2dImageRGBA as a buffer.
670  A strong feature is the ability to draw (rotated) wxImage's
671 
672  \ingroup drawer
673 */
674 class A2DAGGDRAWERDLLEXP a2dAggDrawerRgba : public a2dAggDrawerBase
675 {
676  DECLARE_DYNAMIC_CLASS( a2dAggDrawerRgba )
677 
678 public:
679 
680  //! Drawer having a buffer of w pixel wide and h pixels heigh
681  a2dAggDrawerRgba( int width = 0, int height = 0 );
682 
683  //! Drawer having a buffer of w pixel wide and h pixels height given by size
684  a2dAggDrawerRgba( const wxSize& size );
685 
686  //! bitmap is converted to image on which you can draw.
687  //! Use GetBuffer() to get a bitmap back.
688  a2dAggDrawerRgba( const wxBitmap& bitmap );
689 
690  //! copy constructor
691  a2dAggDrawerRgba( const a2dAggDrawerRgba& other );
692 
693  //!get buffer as bitmap pointer
694  wxBitmap GetBuffer() const;
695 
696  //! return wxImage which is used as buffer here
697  wxImage GetImageBuffer() const;
698 
699  //!set buffer size to w pixel wide and h pixels heigh
700  void SetBufferSize( int w, int h );
701 
702  //!get part of the buffer given a rect
703  wxBitmap GetSubBitmap( wxRect sub_rect ) const;
704 
705  void CopyIntoBuffer( const wxBitmap& bitm );
706 
707  virtual ~a2dAggDrawerRgba();
708 
709  void BlitBuffer( wxDC* dc, wxRect rect, const wxPoint& bufferpos = wxPoint( 0, 0 ) );
710 
711  void ShiftBuffer( int dxy, bool yshift );
712 
713  void DrawImage( const wxImage& image, double x, double y, double width, double height, wxUint8 Opacity = 255 );
714 
715  void DrawImage( const a2dImageRGBA& image, double x, double y, double width, double height, wxUint8 Opacity = 255 );
716 
717 protected:
718 
719  void DeviceDrawPixel( int x1, int y1, unsigned char r, unsigned char g, unsigned char b, unsigned char a );
720 
721  void DoSetDrawStyle( a2dDrawStyle drawstyle );
722 
723  void Render( bool fillColor );
724  virtual void RenderGradient( bool radial );
725  virtual void RenderBitmapFill();
726  virtual void RenderSetClip();
727 
728  a2dImageRGBA m_buffer;
729 
730  bool m_needbufferupdate;
731 
732 private:
733 
734  PixFormatA m_pixFormat;
735  PixFormatComp m_pixFormatComp;
736  RendererBaseA m_renBase;
737  RendererBaseComp m_renBaseComp;
738  RendererSolidComp m_renSolidComp;
739  RendererSolidAaA m_renderer;
740 
741  agg::rendering_buffer m_rendering_buffer;
742 
743 };
744 
745 namespace
746 {
747 
748 //! converter of an image to a certain alpha
749 class span_conv_const_alpha_rgba8
750 {
751 public:
752  typedef agg::rgba8 color_type;
753  typedef agg::int8u alpha_type;
754 
755  span_conv_const_alpha_rgba8( alpha_type a ) :
756  m_alpha( a ) {}
757 
758  void alpha( alpha_type a ) { m_alpha = a; }
759  alpha_type alpha() const { return m_alpha; }
760 
761  void prepare() {}
762  void generate( color_type* colors, int x, int y, unsigned len ) const
763  {
764  do
765  {
766  colors->a = colors->a * m_alpha / 255 ;
767  ++colors;
768  }
769  while( --len );
770  }
771 
772 private:
773  alpha_type m_alpha;
774 };
775 
776 //! converter of an image to a certain alpha
777 class span_conv_array_alpha_rgba8
778 {
779 public:
780  typedef agg::rgba8 color_type;
781  typedef agg::int8u alpha_type;
782 
783  span_conv_array_alpha_rgba8( const wxImage& image, alpha_type a ) :
784  m_image( image ), m_alpha( a ) {}
785 
786  void prepare() {}
787  void generate( color_type* colors, int x, int y, unsigned len ) const
788  {
789  do
790  {
791  colors->a = m_image.GetAlpha( x++, y ) * m_alpha / 255;
792  ++colors;
793  }
794  while( --len );
795  }
796 
797 private:
798  alpha_type m_alpha;
799  wxImage m_image;
800 };
801 
802 
803 }
804 
805 
806 namespace agg
807 {
808 
809 //========================================================================
810 template<> struct gradient_linear_color<rgba8>
811 {
812  typedef rgba8 color_type;
813 
814  gradient_linear_color() {}
815  gradient_linear_color( const color_type& c1, const color_type& c2 ) :
816  m_c1( c1 ), m_c2( c2 ) {}
817 
818  color_type operator [] ( unsigned v ) const
819  {
820  color_type c;
821  c.r = ( int8u )( ( ( ( m_c2.r - m_c1.r ) * int( v ) ) + ( m_c1.r << 8 ) ) >> 8 );
822  c.g = ( int8u )( ( ( ( m_c2.g - m_c1.g ) * int( v ) ) + ( m_c1.g << 8 ) ) >> 8 );
823  c.b = ( int8u )( ( ( ( m_c2.b - m_c1.b ) * int( v ) ) + ( m_c1.b << 8 ) ) >> 8 );
824  c.a = ( int8u )( ( ( ( m_c2.a - m_c1.a ) * int( v ) ) + ( m_c1.a << 8 ) ) >> 8 );
825  return c;
826  }
827 
828  void colors( const color_type& c1, const color_type& c2 )
829  {
830  m_c1 = c1;
831  m_c2 = c2;
832  }
833 
834  color_type m_c1;
835  color_type m_c2;
836 };
837 
838 //========================================================span_pattern_a2d
839 template<class Source> class span_pattern_a2d
840 {
841 public:
842  typedef Source source_type;
843  typedef typename source_type::color_type color_type;
844  typedef typename source_type::order_type order_type;
845  typedef typename color_type::value_type value_type;
846  typedef typename color_type::calc_type calc_type;
847 
848  //--------------------------------------------------------------------
849  span_pattern_a2d() {}
850  span_pattern_a2d( source_type& src,
851  unsigned offset_x, unsigned offset_y ) :
852  m_src( &src ),
853  m_offset_x( offset_x ),
854  m_offset_y( offset_y ),
855  m_alpha( color_type::base_mask )
856  {}
857 
858  //--------------------------------------------------------------------
859  void attach( source_type& v ) { m_src = &v; }
860  source_type& source() { return *m_src; }
861  const source_type& source() const { return *m_src; }
862 
863  //--------------------------------------------------------------------
864  void offset_x( unsigned v ) { m_offset_x = v; }
865  void offset_y( unsigned v ) { m_offset_y = v; }
866  unsigned offset_x() const { return m_offset_x; }
867  unsigned offset_y() const { return m_offset_y; }
868  void alpha( value_type v ) { m_alpha = v; }
869  value_type alpha() const { return m_alpha; }
870 
871  //--------------------------------------------------------------------
872  void prepare() {}
873  void generate( color_type* span, int x, int y, unsigned len )
874  {
875  x += m_offset_x;
876  y += m_offset_y;
877  const value_type* p = ( const value_type* )m_src->span( x, y, len );
878  do
879  {
880  span->r = p[order_type::R];
881  span->g = p[order_type::G];
882  span->b = p[order_type::B];
883  if ( span->r == 255 && span->g == 255 && span->b == 255 )
884  span->a = 0;
885  else
886  span->a = m_alpha;
887  p = m_src->next_x();
888  ++span;
889  }
890  while( --len );
891  }
892 
893 private:
894  source_type* m_src;
895  unsigned m_offset_x;
896  unsigned m_offset_y;
897  value_type m_alpha;
898 
899 };
900 }
901 
903 {
904 public:
905  plain_rect() {}
906  plain_rect( double x1, double y1, double x2, double y2 ) :
907  m_x1( x1 ), m_y1( y1 ), m_x2( x2 ), m_y2( y2 )
908  {
909  if( x1 > x2 ) { m_x1 = x2; m_x2 = x1; }
910  if( y1 > y2 ) { m_y1 = y2; m_y2 = y1; }
911  }
912 
913  void rect( double x1, double y1, double x2, double y2 )
914  {
915  m_x1 = x1; m_y1 = y1; m_x2 = x2; m_y2 = y2;
916  if( x1 > x2 ) { m_x1 = x2; m_x2 = x1; }
917  if( y1 > y2 ) { m_y1 = y2; m_y2 = y1; }
918  }
919  void rewind( unsigned ) { m_status = 0;}
920  unsigned vertex( double* x, double* y )
921  {
922  switch( m_status )
923  {
924  case 0:
925  *x = m_x1; *y = m_y1;
926  m_status++;
927  return agg::path_cmd_move_to;
928 
929  case 1:
930  *x = m_x2; *y = m_y1;
931  m_status++;
932  return agg::path_cmd_line_to;
933 
934  case 2:
935  *x = m_x2; *y = m_y2;
936  m_status++;
937  return agg::path_cmd_line_to;
938 
939  case 3:
940  *x = m_x1; *y = m_y2;
941  m_status++;
942  return agg::path_cmd_line_to;
943 
944  case 4:
945  *x = m_x1; *y = m_y1;
946  m_status++;
947  return agg::path_cmd_line_to;
948 
949  case 5:
950  m_status++;
951  return agg::path_cmd_end_poly | agg::path_flags_close | agg::path_flags_ccw;
952  }
953  return agg::path_cmd_stop;
954  }
955 private:
956  double m_x1;
957  double m_y1;
958  double m_x2;
959  double m_y2;
960  unsigned m_status;
961 };
962 
963 
964 #endif
965 
966 #endif
virtual void ExtendClippingRegion(a2dVertexList *points, bool spline=false, wxPolygonFillMode fillStyle=wxODDEVEN_RULE, a2dBooleanClip clipoperation=a2dCLIP_AND)=0
extend clipping region with a polygon to which everything drawn will be clipped.
virtual void DeviceDrawPixel(int x1, int y1, unsigned char r, unsigned char g, unsigned char b, unsigned char a=255)
draw a single, unstroked pixel in device coordinates with the given color
Definition: drawer2d.cpp:3100
agg::renderer_scanline_aa_solid< RendererBaseA > RendererSolidAaA
solid rendering on top of base rendering Agg
Definition: aggdrawer.h:141
virtual void DestroyClippingRegion()=0
set clipping region off
virtual void DrawPolygon(a2dVertexArray *points, bool spline=false, wxPolygonFillMode fillStyle=wxODDEVEN_RULE)
Draw polygon in world coordinates using pointarray.
Definition: drawer2d.cpp:1889
vertex array of line and arc segments.
Definition: polyver.h:494
vertex list of line and arc segments.
Definition: polyver.h:600
virtual void DrawCharStroke(wxChar c)
Draw a stroke character.
Definition: drawer2d.cpp:2270
a2dDrawStyle
Define the manner in which a2dCanvasView draws to the device.
Definition: artglob.h:280
virtual wxBitmap GetSubBitmap(wxRect sub_rect) const =0
A way to get parts form the buffer that is drawn into.
virtual void DrawRoundedRectangle(double x, double y, double width, double height, double radius, bool pixelsize=false)
Draw RoundedRectangle in world coordinates.
Definition: drawer2d.cpp:2048
virtual void ResetStyle()
set a pre-defined style reseting cashed values.
Definition: drawer2d.cpp:545
virtual void DrawCharDc(wxChar c)
Draw a dc character.
Definition: drawer2d.h:981
virtual void DrawPoint(double xc, double yc)=0
draw a single point
virtual void DrawPolyPolygon(a2dListOfa2dVertexList polylist, wxPolygonFillMode fillStyle=wxODDEVEN_RULE)
draw a list of polygons ( contour clockwise becomes hole )
Definition: drawer2d.cpp:1881
the antigrain based drawing context derived from a2dDrawer2D
Definition: aggdrawer.h:674
Drawing context abstraction.
Definition: drawer2d.h:177
virtual void DrawImage(const wxImage &image, double x, double y, double width, double height, wxUint8 Opacity=255)=0
Draw wxImage in world coordinates.
bool HasAlpha()
does a derived drawer have alpha support or not
Definition: aggdrawer.h:464
virtual void ShiftBuffer(int dxy, bool yshift)
quick scroll over small distance
Definition: drawer2d.h:271
agg::renderer_base< PixFormatA > RendererBaseA
base rendering Agg
Definition: aggdrawer.h:138
virtual void DoSetActiveStroke()=0
per drawer implementation
virtual void DoSetActiveFill()=0
per drawer implementation
wxImage & GetImageBuffer()
return wxImage which is used as buffer here
Definition: aggdrawer.h:624
the antigrain based drawing context derived from a2dDrawer2D
Definition: aggdrawer.h:601
agg::pixfmt_rgba32 PixFormatA
color format in a2dAggDrawer
Definition: aggdrawer.h:132
agg::rgba8 color_type
color format in a2dAggDrawer
Definition: aggdrawer.h:112
virtual void ExtendAndPushClippingRegion(a2dVertexList *points, bool spline=false, wxPolygonFillMode fillStyle=wxODDEVEN_RULE, a2dBooleanClip clipoperation=a2dCLIP_AND)=0
push on stack the current clipping region and extend clipping region
virtual void SetClippingRegion(a2dVertexList *points, bool spline=false, wxPolygonFillMode fillStyle=wxODDEVEN_RULE)=0
set clipping region from polygon to which everything drawn will be clipped.
wxDC * GetDeviceDC() const
get the DC that is used for rendering
Definition: aggdrawer.h:500
Contains graphical drawing context specific classes. a2dDrawer2D and derived classes are used for dra...
a2dBooleanClip
Used for defining how a ClippingRegion defined as a polygon is combined with.
Definition: drawer2d.h:54
virtual void DrawCharFreetype(wxChar c)
Draw a freetype character.
Definition: drawer2d.h:966
virtual void SetClippingRegionDev(wxCoord minx, wxCoord miny, wxCoord maxx, wxCoord maxy)=0
set clipping region using x y values in device coordinates
virtual wxBitmap GetBuffer() const =0
Return the buffer as a bitmap.
virtual void BeginDraw()=0
start to draw on this context (used to initialize a specific drawer)
void BlitBuffer()
blit whole buffer to device
Definition: drawer2d.cpp:183
virtual void PopClippingRegion()=0
pop a previously pushed clipping region
virtual void EndDraw()=0
end drawing on this context (used to reset a specific drawer)
virtual void DrawEllipse(double x, double y, double width, double height)
Draw Ellipse in world coordinates.
Definition: drawer2d.cpp:2121
virtual void SetBufferSize(int w, int h)=0
Change the buffer size.
virtual void DrawCircle(double x, double y, double radius)
Draw Circle in world coordinates.
Definition: drawer2d.cpp:2116
agg::renderer_base< PixFormat > RendererBase
base rendering Agg
Definition: aggdrawer.h:116
virtual void DrawLines(a2dVertexArray *points, bool spline=false)
Draw polyline in world coordinates using pointarray.
Definition: drawer2d.cpp:1931
a2dStrokeStyle
stroke styles for a2dStroke
Definition: stylebase.h:298
agg::renderer_scanline_aa_solid< RendererBase > RendererSolidAa
solid rendering on top of base rendering Agg
Definition: aggdrawer.h:118
aggdrawer.h Source File -- Sun Oct 12 2014 17:04:12 -- Sun Oct 12 2014 -- 1.8.5 -- wxArt2D -- . -- Main Page Reference Documentation