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
14
agg_platform_support ,
27
agg_renderer_scanline ,
28
agg_rasterizer_scanline_aa ,
31
agg_render_scanlines ,
32
agg_renderer_outline_aa ,
33
agg_renderer_outline_image ,
38
agg_pattern_filters_rgba ,
56
curve_point_ptr = ^curve_point;
58
x ,y ,dist ,mu : double;
60
constructor Construct; overload;
61
constructor Construct(x1 ,y1 ,mu1 : double ); overload;
65
the_application = object(platform_support )
66
m_ctrl_color : aggclr;
68
m_curve1 : bezier_ctrl;
71
m_approximation_scale ,
73
m_width : slider_ctrl;
76
m_show_outline : cbox_ctrl;
81
m_line_cap : rbox_ctrl;
83
m_cur_case_type : int;
85
constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
88
function measure_time(curve : curve_ptr ) : double;
89
function find_point (path : pod_deque_ptr; dist : double; i ,j : unsigned_ptr ) : boolean;
91
function calc_max_error(curve : curve_ptr; scale : double; max_angle_error : double_ptr ) : double;
93
procedure on_draw; virtual;
95
procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
96
procedure on_ctrl_change; virtual;
101
procedure bezier4_point(
102
x1 ,y1 ,x2 ,y2 ,x3 ,y3 ,x4 ,y4 ,mu : double;
105
mum1 ,mum13 ,mu3 : double;
109
mum13:=mum1 * mum1 * mum1;
112
x^:=mum13 * x1 + 3 * mu * mum1 * mum1 * x2 + 3 * mu * mu * mum1 * x3 + mu3 * x4;
113
y^:=mum13 * y1 + 3 * mu * mum1 * mum1 * y2 + 3 * mu * mu * mum1 * y3 + mu3 * y4;
118
constructor curve_point.Construct;
128
constructor curve_point.Construct(x1 ,y1 ,mu1 : double );
138
constructor the_application.Construct;
140
inherited Construct(format_ ,flip_y_ );
142
m_ctrl_color.ConstrDbl(0 ,0.3 ,0.5 ,0.8 );
144
m_angle_tolerance.Construct (5.0 ,5.0 ,240.0 ,12.0 ,not flip_y_ );
145
m_approximation_scale.Construct(5.0 ,17 + 5.0 , 240.0 ,17 + 12.0 ,not flip_y_ );
146
m_cusp_limit.Construct (5.0 ,17 + 17 + 5.0 ,240.0 ,17 + 17 + 12.0 ,not flip_y_ );
147
m_width.Construct (245.0 ,5.0 ,495.0 ,12.0 ,not flip_y_ );
148
m_show_points.Construct (250.0 ,15 + 5 ,'Show Points' ,not flip_y_ );
149
m_show_outline.Construct (250.0 ,30 + 5 ,'Show Stroke Outline' ,not flip_y_ );
150
m_curve_type.Construct (535.0 ,5.0 ,535.0 + 115.0 ,55.0 ,not flip_y_ );
151
m_case_type.Construct (535.0 ,60.0 ,535.0 + 115.0 ,195.0 ,not flip_y_ );
152
m_inner_join.Construct (535.0 ,200.0 ,535.0 + 115.0 ,290.0 ,not flip_y_ );
153
m_line_join.Construct (535.0 ,295.0 ,535.0 + 115.0 ,385.0 ,not flip_y_ );
154
m_line_cap.Construct (535.0 ,395.0 ,535.0 + 115.0 ,455.0 ,not flip_y_ );
159
m_curve1.line_color_(@m_ctrl_color );
161
m_curve1.curve_(170 ,424 ,13 ,87 ,488 ,423 ,26 ,333 );
162
//m_curve1.curve_(26.000 ,333.000 ,276.000 ,126.000 ,402.000 ,479.000 ,26.000 ,333.000 ); // Loop with p1==p4
163
//m_curve1.curve_(378.000 ,439.000 ,378.000 ,497.000 ,487.000 ,432.000 ,14.000 ,338.000 ); // Narrow loop
164
//m_curve1.curve_(288.000 ,283.000 ,232.000 ,89.000 ,66.000 ,197.000 ,456.000 ,241.000 ); // Loop
165
//m_curve1.curve_(519.000 ,142.000 ,97.000 ,147.000 ,69.000 ,147.000 ,30.000 ,144.000 ); // Almost straight
166
//m_curve1.curve_(100 ,100 ,200 ,100 ,100 ,200 ,200 ,200 ); // A "Z" case
167
//m_curve1.curve_(150 ,150 ,350 ,150 ,150 ,150 ,350 ,150 ); // Degenerate
168
//m_curve1.curve_(409 ,330 ,300 ,200 ,200 ,200 ,401 ,263 ); // Strange cusp
169
//m_curve1.curve_(129 ,233 ,172 ,320 ,414 ,253 ,344 ,236 ); // Curve cap
170
//m_curve1.curve_(100 ,100 ,100 ,200 ,100 ,100 ,110 ,100 ); // A "boot"
171
//m_curve1.curve_(225 ,150 ,60 ,150 ,460 ,150 ,295 ,150 ); // 2----1----4----3
172
//m_curve1.curve_(162.2 ,248.801 ,162.2 ,248.801 ,266 ,284 ,394 ,335 ); // Coinciding 1-2
173
//m_curve1.curve_(162.200 ,248.801 ,162.200 ,248.801 ,257.000 ,301.000 ,394.000 ,335.000 ); // Coinciding 1-2
174
//m_curve1.curve_(394.000 ,335.000 ,257.000 ,301.000 ,162.200 ,248.801 ,162.200 ,248.801 ); // Coinciding 3-4
175
//m_curve1.curve_(84.200000 ,302.80100 ,84.200000 ,302.80100 ,79.000000 ,292.40100 ,97.001000 ,304.40100 ); // From tiger.svg
176
//m_curve1.curve_(97.001000 ,304.40100 ,79.000000 ,292.40100 ,84.200000 ,302.80100 ,84.200000 ,302.80100 ); // From tiger.svg opposite dir
177
//m_curve1.curve_(475 ,157 ,200 ,100 ,453 ,100 ,222 ,157 ); // Cusp, failure for Adobe SVG
179
add_ctrl(@m_curve1 );
181
m_curve1.no_transform;
183
m_angle_tolerance.label_('Angle Tolerance=%.0f deg' );
184
m_angle_tolerance.range_(0 ,90 );
185
m_angle_tolerance.value_(15 );
187
add_ctrl(@m_angle_tolerance );
189
m_angle_tolerance.no_transform;
191
m_approximation_scale.label_('Approximation Scale=%.3f' );
192
m_approximation_scale.range_(0.1 ,5 );
193
m_approximation_scale.value_(1.0 );
195
add_ctrl(@m_approximation_scale );
197
m_approximation_scale.no_transform;
199
m_cusp_limit.label_('Cusp Limit=%.0f deg' );
200
m_cusp_limit.range_(0 ,90);
201
m_cusp_limit.value_(0 );
203
add_ctrl(@m_cusp_limit );
205
m_cusp_limit.no_transform;
207
m_width.label_('Width=%.2f' );
208
m_width.range_(0.0 ,100 );
209
m_width.value_(50.0 );
213
m_width.no_transform;
215
add_ctrl(@m_show_points );
217
m_show_points.no_transform;
218
m_show_points.status_(true );
220
add_ctrl(@m_show_outline );
222
m_show_outline.no_transform;
223
m_show_outline.status_(true );
225
m_curve_type.add_item ('Incremental' );
226
m_curve_type.add_item ('Subdiv' );
227
m_curve_type.cur_item_(1 );
229
add_ctrl(@m_curve_type );
231
m_curve_type.no_transform;
233
m_case_type.text_size_ (7 );
234
m_case_type.text_thickness_(1.0 );
236
m_case_type.add_item('Random' );
237
m_case_type.add_item('13---24' );
238
m_case_type.add_item('Smooth Cusp 1' );
239
m_case_type.add_item('Smooth Cusp 2' );
240
m_case_type.add_item('Real Cusp 1' );
241
m_case_type.add_item('Real Cusp 2' );
242
m_case_type.add_item('Fancy Stroke' );
243
m_case_type.add_item('Jaw' );
244
m_case_type.add_item('Ugly Jaw' );
246
add_ctrl(@m_case_type );
248
m_case_type.no_transform;
250
m_inner_join.text_size_(8 );
252
m_inner_join.add_item ('Inner Bevel' );
253
m_inner_join.add_item ('Inner Miter' );
254
m_inner_join.add_item ('Inner Jag' );
255
m_inner_join.add_item ('Inner Round' );
256
m_inner_join.cur_item_(3 );
258
add_ctrl(@m_inner_join );
260
m_inner_join.no_transform;
262
m_line_join.text_size_(8 );
264
m_line_join.add_item ('Miter Join' );
265
m_line_join.add_item ('Miter Revert' );
266
m_line_join.add_item ('Miter Round' );
267
m_line_join.add_item ('Round Join' );
268
m_line_join.add_item ('Bevel Join' );
269
m_line_join.cur_item_(1 );
271
add_ctrl(@m_line_join );
273
m_line_join.no_transform;
275
m_line_cap.text_size_(8 );
277
m_line_cap.add_item ('Butt Cap' );
278
m_line_cap.add_item ('Square Cap' );
279
m_line_cap.add_item ('Round Cap' );
280
m_line_cap.cur_item_(0 );
282
add_ctrl(@m_line_cap );
284
m_line_cap.no_transform;
289
destructor the_application.Destruct;
293
m_angle_tolerance.Destruct;
294
m_approximation_scale.Destruct;
295
m_cusp_limit.Destruct;
297
m_show_points.Destruct;
298
m_show_outline.Destruct;
299
m_curve_type.Destruct;
300
m_case_type.Destruct;
301
m_inner_join.Destruct;
302
m_line_join.Destruct;
309
function the_application.measure_time;
321
m_curve1._x1 ,m_curve1._y1 ,
322
m_curve1._x2 ,m_curve1._y2 ,
323
m_curve1._x3 ,m_curve1._y3 ,
324
m_curve1._x4 ,m_curve1._y4 );
328
while not is_stop(curve.vertex(@x ,@y ) ) do;
332
result:=elapsed_time * 10;
337
function the_application.find_point;
347
k:=shr_int32(i^ + j^ ,1 );
349
if dist < vertex_dist_ptr(path.array_operator(k ) ).dist then
361
function the_application.calc_max_error;
363
cmd ,i ,idx1 ,idx2 : unsigned;
365
x ,y ,curve_dist ,mu ,reference_dist ,max_error ,err ,aerr ,a1 ,a2 ,da : double;
367
curve_points ,reference_points : pod_deque;
373
curve_points.Construct (sizeof(vertex_dist ) ,8 );
374
reference_points.Construct(sizeof(curve_point ) ,8 );
376
curve.approximation_scale_(m_approximation_scale._value * scale );
379
m_curve1._x1 ,m_curve1._y1 ,
380
m_curve1._x2 ,m_curve1._y2 ,
381
m_curve1._x3 ,m_curve1._y3 ,
382
m_curve1._x4 ,m_curve1._y4 );
388
cmd:=curve.vertex(@x ,@y );
390
while not is_stop(cmd ) do
392
if is_vertex(cmd ) then
397
curve_points.add(@vd );
401
cmd:=curve.vertex(@x ,@y );
409
while i < curve_points.size do
411
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).dist:=curve_dist;
416
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).x ,
417
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).y ,
418
vertex_dist_ptr(curve_points.array_operator(i ) ).x ,
419
vertex_dist_ptr(curve_points.array_operator(i ) ).y );
425
vertex_dist_ptr(curve_points.array_operator(curve_points.size - 1 ) ).dist:=curve_dist;
432
m_curve1._x1 , m_curve1._y1 ,
433
m_curve1._x2 , m_curve1._y2 ,
434
m_curve1._x3 , m_curve1._y3 ,
435
m_curve1._x4 , m_curve1._y4 ,
438
cp.Construct(x ,y ,mu );
440
reference_points.add(@cp );
448
while i < reference_points.size do
450
curve_point_ptr(reference_points.array_operator(i - 1 ) ).dist:=reference_dist;
455
curve_point_ptr(reference_points.array_operator(i - 1 ) ).x ,
456
curve_point_ptr(reference_points.array_operator(i - 1 ) ).y ,
457
curve_point_ptr(reference_points.array_operator(i ) ).x ,
458
curve_point_ptr(reference_points.array_operator(i ) ).y );
464
curve_point_ptr(reference_points.array_operator(reference_points.size - 1 ) ).dist:=reference_dist;
473
while i < reference_points.size do
477
curve_point_ptr(reference_points.array_operator(i ) ).dist ,
482
calc_line_point_distance(
483
vertex_dist_ptr(curve_points.array_operator(idx1 ) ).x ,
484
vertex_dist_ptr(curve_points.array_operator(idx1 ) ).y ,
485
vertex_dist_ptr(curve_points.array_operator(idx2 ) ).x ,
486
vertex_dist_ptr(curve_points.array_operator(idx2 ) ).y ,
487
curve_point_ptr(reference_points.array_operator(i ) ).x ,
488
curve_point_ptr(reference_points.array_operator(i ) ).y ) );
490
if err > max_error then
503
while i < curve_points.size do
507
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).y -
508
vertex_dist_ptr(curve_points.array_operator(i - 2 ) ).y ,
509
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).x -
510
vertex_dist_ptr(curve_points.array_operator(i - 2 ) ).x );
514
vertex_dist_ptr(curve_points.array_operator(i ) ).y -
515
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).y ,
516
vertex_dist_ptr(curve_points.array_operator(i ) ).x -
517
vertex_dist_ptr(curve_points.array_operator(i - 1 ) ).x );
531
max_angle_error^:=aerr * 180.0 / pi;
533
result:=max_error * scale;
535
curve_points.Destruct;
536
reference_points.Destruct;
541
procedure the_application.on_draw;
543
ren_base : renderer_base;
547
ren : renderer_scanline_aa_solid;
548
ras : rasterizer_scanline_aa;
554
stroke2 : conv_stroke;
557
buf : array[0..511 ] of char;
562
cmd ,num_points1 : unsigned;
570
max_angle_error_100 ,
576
max_error_100 : double;
581
// Initialize structures
582
pixfmt_bgr24(pf ,rbuf_window );
584
ren_base.Construct(@pf );
585
rgba.ConstrDbl (1.0 ,1.0 ,0.95 );
586
ren_base.clear (@rgba );
588
ren.Construct(@ren_base );
601
curve.approximation_method_(curve_approximation_method_e(m_curve_type._cur_item ) );
602
curve.approximation_scale_ (m_approximation_scale._value );
604
curve.angle_tolerance_(deg2rad(m_angle_tolerance._value ) );
605
curve.cusp_limit_ (deg2rad(m_cusp_limit._value ) );
607
curve_time:=measure_time(@curve );
609
max_angle_error_01 :=0;
610
max_angle_error_1 :=0;
611
max_angle_error1 :=0;
612
max_angle_error_10 :=0;
613
max_angle_error_100:=0;
620
max_error_01 :=calc_max_error(@curve ,0.01 ,@max_angle_error_01 );
621
max_error_1 :=calc_max_error(@curve ,0.1 ,@max_angle_error_1 );
622
max_error1 :=calc_max_error(@curve ,1 ,@max_angle_error1 );
623
max_error_10 :=calc_max_error(@curve ,10 ,@max_angle_error_10 );
624
max_error_100:=calc_max_error(@curve ,100 ,@max_angle_error_100 );
626
curve.approximation_scale_(m_approximation_scale._value );
627
curve.angle_tolerance_ (deg2rad(m_angle_tolerance._value ) );
628
curve.cusp_limit_ (deg2rad(m_cusp_limit._value ) );
631
m_curve1._x1 ,m_curve1._y1 ,
632
m_curve1._x2 ,m_curve1._y2 ,
633
m_curve1._x3 ,m_curve1._y3 ,
634
m_curve1._x4 ,m_curve1._y4 );
636
path.add_path(@curve ,0 ,false );
638
stroke.Construct(@path );
639
stroke.width_ (m_width._value );
641
stroke.line_join_ (m_line_join._cur_item );
642
stroke.line_cap_ (m_line_cap._cur_item );
643
stroke.inner_join_ (m_inner_join._cur_item );
644
stroke.inner_miter_limit_(1.01 );
646
ras.add_path (@stroke );
647
rgba.ConstrDbl (0 ,0.5 ,0 ,0.5 );
649
render_scanlines(@ras ,@sl ,@ren );
651
// Render internal points
656
cmd:=path.vertex(@x ,@y );
658
while not is_stop(cmd ) do
660
if m_show_points._status then
662
ell.Construct(x ,y ,1.5 ,1.5 ,8 );
664
ras.add_path (@ell );
665
rgba.ConstrDbl (0 ,0 ,0 ,0.5 );
667
render_scanlines(@ras ,@sl ,@ren );
673
cmd:=path.vertex(@x ,@y );
678
if m_show_outline._status then
680
// Draw a stroke of the stroke to see the internals
681
stroke2.Construct(@stroke );
682
ras.add_path (@stroke2 );
683
rgba.ConstrDbl (0 ,0 ,0 ,0.5 );
685
render_scanlines (@ras ,@sl ,@ren );
689
// Check ellipse and arc for the number of points
690
{a.Construct (100 ,100 ,m_width.value ,m_width.value ,0 );
692
rgba.ConstrDbl (0.5 ,0 ,0 ,0.5 );
694
render_scanlines(@ras ,@sl ,@ren );
698
cmd:=a.vertex(@x ,@ y);
700
while not is_stop(cmd ) do
702
if is_vertex(cmd ) then
704
ell.Construct (x ,y ,1.5 ,1.5 ,8 );
705
ras.add_path (@ell );
706
rgba.ConstrDbl (0 ,0 ,0 ,0.5 );
708
render_scanlines(@ras ,@sl ,@ren );
712
cmd:=a.vertex(@x ,@y );
721
pt.line_cap_ (round_cap );
722
pt.line_join_(round_join );
725
sprintf(@buf[0 ] ,'Num Points=%d ' ,num_points1 );
726
sprintf(@buf[StrLen(@buf ) ] ,'Time=%.2fmks'#13#13 ,curve_time );
727
sprintf(@buf[StrLen(@buf ) ] ,' Dist Error: x0.01=%.5f ' ,max_error_01 );
728
sprintf(@buf[StrLen(@buf ) ] ,'x0.1=%.5f ' ,max_error_1 );
729
sprintf(@buf[StrLen(@buf ) ] ,'x1=%.5f ' ,max_error1 );
730
sprintf(@buf[StrLen(@buf ) ] ,'x10=%.5f ' ,max_error_10 );
731
sprintf(@buf[StrLen(@buf ) ] ,'x100=%.5f'#13#13 ,max_error_100 );
732
sprintf(@buf[StrLen(@buf ) ] ,'Angle Error: x0.01=%.1f ' ,max_angle_error_01 );
733
sprintf(@buf[StrLen(@buf ) ] ,'x0.1=%.1f ' ,max_angle_error_1 );
734
sprintf(@buf[StrLen(@buf ) ] ,'x1=%.1f ' ,max_angle_error1 );
735
sprintf(@buf[StrLen(@buf ) ] ,'x10=%.1f ' ,max_angle_error_10 );
736
sprintf(@buf[StrLen(@buf ) ] ,'x100=%.1f' ,max_angle_error_100 );
738
t.start_point_(10.0 ,85.0 );
742
rgba.ConstrDbl (0 ,0 ,0 );
744
render_scanlines(@ras ,@sl ,@ren );
746
// Render the controls
747
render_ctrl(@ras ,@sl ,@ren ,@m_curve1 );
748
render_ctrl(@ras ,@sl ,@ren ,@m_angle_tolerance );
749
render_ctrl(@ras ,@sl ,@ren ,@m_approximation_scale );
750
render_ctrl(@ras ,@sl ,@ren ,@m_cusp_limit );
751
render_ctrl(@ras ,@sl ,@ren ,@m_width );
752
render_ctrl(@ras ,@sl ,@ren ,@m_show_points );
753
render_ctrl(@ras ,@sl ,@ren ,@m_show_outline );
754
render_ctrl(@ras ,@sl ,@ren ,@m_curve_type );
755
render_ctrl(@ras ,@sl ,@ren ,@m_case_type );
756
render_ctrl(@ras ,@sl ,@ren ,@m_inner_join );
757
render_ctrl(@ras ,@sl ,@ren ,@m_line_join );
758
render_ctrl(@ras ,@sl ,@ren ,@m_line_cap );
760
// Free AGG resources
775
procedure the_application.on_key;
778
buf : array[0..255 ] of char;
781
if key = byte(' ' ) then
783
AssignFile(fd ,'coord' );
786
sprintf(@buf[0 ] ,'%.3f, ' ,m_curve1._x1 );
787
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._y1 );
788
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._x2 );
789
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._y2 );
790
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._x3 );
791
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._y3 );
792
sprintf(@buf[StrLen(@buf ) ] ,'%.3f, ' ,m_curve1._x4 );
793
sprintf(@buf[StrLen(@buf ) ] ,'%.3f' ,m_curve1._y4 );
795
write(fd ,PChar(@buf[0 ] ) );
802
'Demonstration of new methods of Bezier curve approximation. You can compare '#13 +
803
'the old, incremental method with adaptive De Casteljau''s subdivion. The new '#13 +
804
'method uses two criteria to stop subdivision: estimation of distance and estimation '#13 +
805
'of angle. It gives us perfectly smooth result even for very sharp turns and loops. '#13#13 +
806
'How to play with:'#13#13 +
807
'Use the mouse to change the shape of the curve.'#13 +
808
'Press the spacebar to dump the curve''s coordinates into the "coord" file.' +
809
#13#13'Note: F2 key saves current "screenshot" file in this demo''s directory. ' );
814
procedure the_application.on_ctrl_change;
819
if m_case_type._cur_item <> m_cur_case_type then
821
case m_case_type._cur_item of
822
0 : //m_case_type.add_item("Random");
824
w:=trunc(_width - 120 );
825
h:=trunc(_height - 80 );
828
Random($7fff ) mod w ,Random($7fff ) mod h + 80 ,
829
Random($7fff ) mod w ,Random($7fff ) mod h + 80 ,
830
Random($7fff ) mod w ,Random($7fff ) mod h + 80 ,
831
Random($7fff ) mod w ,Random($7fff ) mod h + 80 );
835
1 : //m_case_type.add_item("13---24");
836
m_curve1.curve_(150 ,150 ,350 ,150 ,150 ,150 ,350 ,150 );
838
2 : //m_case_type.add_item("Smooth Cusp 1");
839
m_curve1.curve_(50 ,142 ,483 ,251 ,496 ,62 ,26 ,333 );
841
3 : //m_case_type.add_item("Smooth Cusp 2");
842
m_curve1.curve_(50 ,142 ,484 ,251 ,496 ,62 ,26 ,333 );
844
4 : //m_case_type.add_item("Real Cusp 1");
845
m_curve1.curve_(100 ,100 ,300 ,200 ,200 ,200 ,200 ,100 );
847
5 : //m_case_type.add_item("Real Cusp 2");
848
m_curve1.curve_(475 ,157 ,200 ,100 ,453 ,100 ,222 ,157 );
850
6 : //m_case_type.add_item("Fancy Stroke");
852
m_curve1.curve_(129 ,233 ,32 ,283 ,258 ,285 ,159 ,232 );
853
m_width.value_ (100 );
857
7 : //m_case_type.add_item("Jaw");
858
m_curve1.curve_(100 ,100 ,300 ,200 ,264 ,286 ,264 ,284 );
860
8 : //m_case_type.add_item("Ugly Jaw");
861
m_curve1.curve_(100 ,100 ,413 ,304 ,264 ,286 ,264 ,284 );
867
m_cur_case_type:=m_case_type._cur_item;
874
app : the_application;
877
app.Construct(pix_format_bgr24 ,flip_y );
878
app.caption_ ('AGG Example (F1-Help)' );
880
if app.init(655 ,520 ,window_resize ) then
b'\\ No newline at end of file'