2
// AggPas 2.4 RM3 Demo application
3
// Note: Press F1 key on run to see more info about this demo
5
// Paths: src;src\ctrl;src\svg;src\util;src\platform\win;expat-wrap
12
agg_platform_support ,
24
agg_renderer_scanline ,
25
agg_rasterizer_scanline_aa ,
29
agg_render_scanlines ,
45
constructor Construct(size : double );
47
procedure draw(ras : rasterizer_scanline_aa_ptr; sl : scanline_ptr; ren : renderer_scanline_ptr; x ,y : double );
51
renderer_enlarged = object(renderer_scanline )
52
m_ras : rasterizer_scanline_aa;
54
m_ren : renderer_scanline_aa_solid_ptr;
60
constructor Construct(ren : renderer_scanline_aa_solid_ptr; size : double );
63
procedure color (c : aggclr_ptr ); virtual;
64
procedure prepare(u : unsigned ); virtual;
65
procedure render (sl : scanline_ptr ); virtual;
69
the_application = object(platform_support )
71
m_y : array[0..2 ] of double;
79
m_slider2 : slider_ctrl;
81
constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
84
procedure on_draw; virtual;
86
procedure on_mouse_move (x ,y : int; flags : unsigned ); virtual;
87
procedure on_mouse_button_down(x ,y : int; flags : unsigned ); virtual;
88
procedure on_mouse_button_up (x ,y : int; flags : unsigned ); virtual;
90
procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
95
constructor square.Construct;
102
procedure square.Draw;
106
ras.move_to_d(x * m_size ,y * m_size );
107
ras.line_to_d(x * m_size + m_size ,y * m_size );
108
ras.line_to_d(x * m_size + m_size ,y * m_size + m_size );
109
ras.line_to_d(x * m_size ,y * m_size + m_size );
111
render_scanlines(ras ,sl ,ren );
116
constructor renderer_enlarged.Construct;
118
m_square.Construct(size );
130
destructor renderer_enlarged.Destruct;
138
procedure renderer_enlarged.color;
145
procedure renderer_enlarged.prepare;
150
procedure renderer_enlarged.render;
155
num_spans : unsigned;
164
num_spans:=sl.num_spans;
169
covers :=span.covers;
173
a:=shr_int32(covers^ * m_color.a ,8 );
175
inc(ptrcomp(covers ) ,sizeof(int8u ) );
177
rgba.ConstrInt(m_color.r ,m_color.g ,m_color.b ,a );
178
m_ren.color_ (@rgba );
179
m_square.draw (@m_ras ,@m_sl ,m_ren ,x ,y );
193
constructor the_application.Construct;
195
inherited Construct(format_ ,flip_y_ );
197
m_slider1.Construct(80 ,10 ,600 - 10 ,19 ,not flip_y );
198
m_slider2.Construct(80 ,10 + 20 ,600 - 10 ,19 + 20 ,not flip_y_ );
202
m_x[0 ]:=57; m_y[0 ]:=100;
203
m_x[1 ]:=369; m_y[1 ]:=170;
204
m_x[2 ]:=143; m_y[2 ]:=310;
206
add_ctrl(@m_slider1 );
207
add_ctrl(@m_slider2 );
209
m_slider1.range_ (8.0 ,100.0 );
210
m_slider1.num_steps_(23 );
211
m_slider1.value_ (32.0 );
213
m_slider2.range_(0.1 ,3.0 );
214
m_slider2.value_(1.0 );
216
m_slider1.label_('Pixel size=%1.0f' );
217
m_slider2.label_('Gamma=%4.3f' );
219
m_slider1.no_transform;
220
m_slider2.no_transform;
225
destructor the_application.Destruct;
235
procedure the_application.on_draw;
239
pixf : pixel_formats;
242
ren : renderer_scanline_aa_solid;
243
ras : rasterizer_scanline_aa;
247
gm_no : vertex_source;
250
ren_en : renderer_enlarged;
256
// Initialize structures
257
pixfmt_bgr24(pixf ,rbuf_window );
259
rb.Construct (@pixf );
262
rgba.ConstrDbl(1 ,1 ,1 );
268
// Draw Zoomed Triangle
269
size_mul:=trunc(m_slider1._value );
271
gm_pw.Construct(m_slider2._value );
274
ren_en.Construct(@ren ,size_mul );
276
rgba.ConstrInt(0 ,0 ,0 ,255 );
277
ren_en.color (@rgba );
280
ras.move_to_d(m_x[0 ] / size_mul ,m_y[0 ] / size_mul );
281
ras.line_to_d(m_x[1 ] / size_mul ,m_y[1 ] / size_mul );
282
ras.line_to_d(m_x[2 ] / size_mul ,m_y[2 ] / size_mul );
284
render_scanlines(@ras ,@sl ,@ren_en );
286
// Draw final triangle bottom-left
287
rgba.ConstrInt(0 ,0 ,0 );
290
render_scanlines(@ras ,@sl ,@ren );
292
// Draw The Supposed Triangle over
300
rgba.ConstrInt(0 ,150 ,160 ,200 );
304
ps.move_to(m_x[0 ] ,m_y[0 ] );
305
ps.line_to(m_x[1 ] ,m_y[1 ] );
309
render_scanlines(@ras ,@sl ,@ren );
312
ps.move_to(m_x[1 ] ,m_y[1 ] );
313
ps.line_to(m_x[2 ] ,m_y[2 ] );
317
render_scanlines(@ras ,@sl ,@ren );
320
ps.move_to(m_x[2 ] ,m_y[2 ] );
321
ps.line_to(m_x[0 ] ,m_y[0 ] );
325
render_scanlines(@ras ,@sl ,@ren );
327
// Render the controls
328
render_ctrl(@ras ,@sl ,@ren ,@m_slider1 );
329
render_ctrl(@ras ,@sl ,@ren ,@m_slider2 );
331
// Free AGG resources
343
procedure the_application.on_mouse_move;
348
if flags and mouse_left <> 0 then
355
m_x[1 ]:=m_x[1 ] - (m_x[0 ] - dx );
356
m_y[1 ]:=m_y[1 ] - (m_y[0 ] - dy );
357
m_x[2 ]:=m_x[2 ] - (m_x[0 ] - dx );
358
m_y[2 ]:=m_y[2 ] - (m_y[0 ] - dy );
369
m_x[m_idx ]:=x - m_dx;
370
m_y[m_idx ]:=y - m_dy;
378
on_mouse_button_up(x ,y ,flags );
382
{ ON_MOUSE_BUTTON_DOWN }
383
procedure the_application.on_mouse_button_down;
388
if flags and mouse_left <> 0 then
394
if Sqrt((x - m_x[ i ] ) * (x - m_x[i ] ) + (y - m_y[i ] ) * (y - m_y[i ] ) ) < 10.0 then
409
if point_in_triangle(m_x[0 ] ,m_y[0 ] ,m_x[1 ] ,m_y[1 ] ,m_x[2 ] ,m_y[2 ] ,x ,y ) then
421
{ ON_MOUSE_BUTTON_UP }
422
procedure the_application.on_mouse_button_up;
429
procedure the_application.on_key;
433
'Demonstration of the Anti-Aliasing principle with Subpixel Accuracy.'#13 +
434
'The triangle is rendered two times, with its "natural" size (at the bottom-left)'#13 +
435
'and enlarged. To draw the enlarged version there was a special scanline'#13 +
436
'renderer written (see class renderer_enlarged in the source code).'#13#13+
437
'How to play with:'#13#13 +
438
'You can drag the whole triangle as well as each vertex of it.'#13 +
439
'Also change "Gamma" to see how it affects the quality of Anti-Aliasing.' +
440
#13#13'Note: F2 key saves current "screenshot" file in this demo''s directory. ' );
445
app : the_application;
448
app.Construct(pix_format_bgr24 ,flip_y );
449
app.caption_ ('AGG Example. Anti-Aliasing Demo (F1-Help)' );
451
if app.init(600 ,400 ,window_resize ) then
b'\\ No newline at end of file'