3
// AggPas 2.4 RM3 Demo application
4
// Milan Marusinec alias Milano (c) 2006 - 2008
5
// Note: Press F1 key on run to see more info about this demo
14
agg_platform_support ,
24
agg_rendering_buffer ,
26
agg_renderer_scanline ,
27
agg_rasterizer_scanline_aa ,
30
agg_render_scanlines ,
49
g_full = 'AggPas 2.4 RM3 vector graphics library';
51
g_agg_paths = 'src;src\ctrl;src\platform\win;src\util;src\svg;gpc;expat-wrap';
53
g_out_paths = '_debug';
55
g_delphi_config = '-CG -B -H- -W-';
56
g_fpc_config = '-Mdelphi -Twin32 -WG -Sg -Se3 -CX -XX -Xs -B -Op3 -v0i';
64
g_lock ,g_image : boolean;
66
g_found ,g_num_demos : unsigned;
68
g_search_results : array[0..g_max - 1 ] of shortstring;
70
g_demos : array[0..g_max_demos - 1 ] of string[99 ];
72
key_array : array[0..key_max - 1 ] of src_key;
75
key_scanx : shortstring;
78
the_application_ptr = ^the_application;
82
func_action = function(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
84
user_action_ptr = ^user_action;
97
dlg_status_e = (ds_none ,ds_define ,ds_ready ,ds_waiting_input ,ds_running );
100
m_appl : the_application_ptr;
110
m_status : dlg_status_e;
112
m_actions : array[0..4 ] of user_action;
113
m_choices : array[0..25 ] of user_choice;
116
m_num_choices : unsigned;
118
m_cur_action : user_action_ptr;
120
m_waiting : func_action;
122
constructor Construct(appl : the_application_ptr; info : PChar; clr : aggclr_ptr = NIL );
125
procedure set_waiting(act : func_action );
127
procedure add_action(name : PChar; act : func_action; x1 ,y1 ,x2 ,y2 : double );
128
procedure add_choice(name ,attr : PChar; x ,y : double; status : boolean = false );
130
procedure change_text(text : PChar; x ,y : double; clr : aggclr_ptr = NIL );
131
procedure append_text(text : PChar );
133
function add_controls : boolean;
134
procedure set_next_status(status : dlg_status_e = ds_none );
136
function find_cur_action : boolean;
137
function call_cur_action : boolean;
138
procedure call_waiting;
142
the_application = object(platform_support )
147
m_dlg_found_some : dialog;
149
m_cur_dlg : dialog_ptr;
151
m_ras : rasterizer_scanline_aa;
158
m_DoShow : shortstring;
160
constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
163
procedure draw_text(x ,y : double; msg : PChar; clr : aggclr_ptr = NIL );
165
procedure on_init; virtual;
166
procedure on_draw; virtual;
168
procedure on_ctrl_change; virtual;
169
procedure on_idle; virtual;
171
procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
176
function NextKey(var val : shortstring ) : boolean;
180
while key_lastx < key_count do
184
if cmp_str(key_array[key_lastx - 1 ].key ) = key_scanx then
186
val:=key_array[key_lastx - 1 ].val;
199
function FirstKey(key : shortstring; var val : shortstring ) : boolean;
202
key_scanx:=cmp_str(key );
204
result:=NextKey(val );
209
procedure LoadKeys(buff : char_ptr; size : int );
211
e_scan = (expect_lp ,load_key ,load_val ,next_ln ,expect_crlf );
220
if key_count < key_max then
222
key_array[key_count ].key:=key;
223
key_array[key_count ].val:=val;
318
inc(ptrcomp(buff ) );
325
constructor dialog.Construct;
327
m_clri.ConstrDbl(0 ,0 ,0 );
328
m_clrt.ConstrDbl(0 ,0 ,0 );
352
destructor dialog.Destruct;
357
if m_text <> NIL then
358
agg_freemem(pointer(m_text ) ,m_aloc );
360
if m_num_actions > 0 then
361
for i:=0 to m_num_actions - 1 do
362
m_actions[i ].ctrl.Destruct;
364
if m_num_choices > 0 then
365
for i:=0 to m_num_choices - 1 do
366
m_choices[i ].ctrl.Destruct;
371
procedure dialog.set_waiting;
378
procedure dialog.add_action;
381
ds_define ,ds_ready :
382
if m_num_actions < 5 then
384
m_actions[m_num_actions ].ctrl.Construct(x1 ,y1 ,x2 ,y2 ,not flip_y );
385
m_actions[m_num_actions ].ctrl.add_item (name );
387
m_actions[m_num_actions ].func:=@act;
391
set_next_status(ds_ready );
400
procedure dialog.add_choice;
403
ds_define ,ds_ready :
404
if m_num_choices < 26 then
406
m_choices[m_num_choices ].ctrl.Construct(x ,y ,name ,not flip_y );
407
m_choices[m_num_choices ].ctrl.status_ (status );
409
m_choices[m_num_choices ].attr:=StrPas(attr ) + #0;
420
procedure dialog.change_text;
422
if StrLen(text ) + 1 > m_aloc then
424
agg_freemem(pointer(m_text ) ,m_aloc );
426
m_aloc:=StrLen(text ) + 1;
428
agg_getmem(pointer(m_text ) ,m_aloc );
432
move(text[0 ] ,m_text^ ,StrLen(text ) + 1 );
434
m_size:=StrLen(text );
444
procedure dialog.append_text;
450
if StrLen(text ) + m_size + 1 > m_aloc then
452
new_aloc:=StrLen(text ) + m_size + 1;
454
agg_getmem(pointer(new_text ) ,new_aloc );
456
move(m_text^ ,new_text^ ,m_size );
458
agg_freemem(pointer(m_text ) ,m_aloc );
465
move(text[0 ] ,char_ptr(ptrcomp(m_text ) + m_size )^ ,StrLen(text ) + 1 );
467
inc(m_size ,StrLen(text ) );
472
function dialog.add_controls;
482
m_appl.m_ctrls.Destruct;
483
m_appl.m_ctrls.Construct;
485
if m_num_actions > 0 then
486
for i:=0 to m_num_actions - 1 do
487
m_appl.add_ctrl(@m_actions[i ].ctrl );
489
if m_num_choices > 0 then
490
for i:=0 to m_num_choices - 1 do
491
m_appl.add_ctrl(@m_choices[i ] );
504
procedure dialog.set_next_status;
506
if status <> ds_none then
514
m_status:=ds_waiting_input;
517
m_status:=ds_running;
524
function dialog.find_cur_action;
533
if m_num_actions > 0 then
534
for i:=0 to m_num_actions - 1 do
535
if m_actions[i ].ctrl._cur_item = 0 then
537
m_cur_action:=@m_actions[i ];
550
// result of true means, that this was the last call
551
function dialog.call_cur_action;
557
if m_cur_action <> NIL then
558
result:=m_cur_action.func(m_appl ,@self );
565
procedure dialog.call_waiting;
567
if @m_waiting <> NIL then
568
m_waiting(m_appl ,@self );
573
procedure create_delphi(batch_file ,comp_path ,project : shortstring );
575
command : AnsiString;
577
suffix ,file_path ,file_name ,file_ext : shortstring;
582
// Compose the units path string
583
spread_name(comp_path ,file_path ,file_name ,file_ext );
585
command:=dir_str(file_path );
587
spread_name(command ,file_path ,suffix ,file_ext );
589
suffix:=file_path + 'lib';
591
// Compose the command string
592
command:='"' + comp_path + 'dcc32.exe" ';
593
command:=command + '-U"' + suffix + '";';
594
command:=command + g_agg_paths + ' ';
595
command:=command + '-I' + g_inc_paths + ' ';
596
command:=command + '-N' + g_out_paths + ' ';
597
command:=command + g_delphi_config + ' ';
598
command:=command + project;
601
AssignFile(df ,batch_file );
603
writeln (df ,command );
609
procedure create_fpc(batch_file ,comp_path ,project : shortstring );
611
command : AnsiString;
613
suffix ,file_path ,file_name ,file_ext : shortstring;
618
// Compose the units path string
619
spread_name(comp_path ,file_path ,file_name ,file_ext );
621
command:=dir_str(file_path );
623
spread_name(command ,file_path ,suffix ,file_ext );
625
command:=dir_str(file_path );
627
spread_name(command ,file_path ,file_name ,file_ext );
629
suffix:=file_path + 'units\' + suffix;
631
// Compose the command string
632
command:='"' + comp_path + 'ppc386.exe" ';
633
command:=command + '-FD"' + suffix + '" ';
634
command:=command + '-Fu' + g_agg_paths + ' ';
635
command:=command + '-Fi' + g_inc_paths + ' ';
636
command:=command + '-FU' + g_out_paths + ' ';
637
command:=command + g_fpc_config + ' ';
638
command:=command + project;
641
AssignFile(df ,batch_file );
643
writeln (df ,command );
648
{ create_batch_files }
649
procedure create_batch_files(project : shortstring; var del ,fpc : unsigned );
651
i ,del_cnt ,fpc_cnt : unsigned;
653
batch ,batch_path ,comp_path ,file_path ,comp_name ,file_name ,file_ext : shortstring;
658
spread_name(ParamStr(0 ) ,batch_path ,file_name ,file_ext );
663
for i:=0 to g_found - 1 do
665
spread_name(g_search_results[i ] ,comp_path ,comp_name ,file_ext );
666
spread_name(project ,file_path ,file_name ,file_ext );
668
if cmp_str(comp_name ) = cmp_str('dcc32' ) then
670
// Make batch for Delphi
674
str(del_cnt ,batch );
676
batch:='delphi' + batch + '-' + file_name;
677
batch:=fold_name(batch_path ,batch ,'*.bat' );
679
create_delphi(batch ,comp_path ,project );
685
str(del_cnt ,file_ext );
687
file_ext :='delphi' + file_ext + '_make_all';
688
file_name:=fold_name(batch_path ,file_ext ,'*.bat' );
690
AssignFile(df ,file_name );
697
file_ext:='call "' + batch + '"';
699
writeln(df ,file_ext );
707
// Make batch for FreePascal
711
str(fpc_cnt ,batch );
713
batch:='fpc' + batch + '-' + file_name;
714
batch:=fold_name(batch_path ,batch ,'*.bat' );
716
create_fpc(batch ,comp_path ,project );
722
str(fpc_cnt ,file_ext );
724
file_ext :='fpc' + file_ext + '_make_all';
725
file_name:=fold_name(batch_path ,file_ext ,'*.bat' );
727
AssignFile(df ,file_name );
734
file_ext:='call "' + batch + '"';
736
writeln(df ,file_ext );
745
inc(del ,del_cnt - 1 );
746
inc(fpc ,fpc_cnt - 1 );
751
function action_configure(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
761
rgba.ConstrDbl(0 ,0.5 ,0 );
763
appl.m_dlg_searching.change_text('Creating appropriate batch files ...' ,10 ,320 ,@rgba );
766
// Setup the final text
767
rgba.ConstrDbl(0 ,0.5 ,0 );
769
appl.m_dlg_found_some.change_text('' ,10 ,385 ,@rgba );
771
for i:=0 to g_found - 1 do
775
text:='(' + text + ') ' + g_search_results[i ] + #13#0;
777
appl.m_dlg_found_some.append_text(@text[1 ] );
781
// Create the batch files
782
if g_num_demos > 0 then
784
appl.m_dlg_found_some.append_text(
786
'Appropriate batch files for compiling the ' + g_appl + ' demos were created'#13 +
787
'in the directory, from which this helper utility was run.' );
792
for i:=0 to g_num_demos - 1 do
793
create_batch_files(g_demos[i ] ,del ,fpc );
796
appl.m_dlg_found_some.append_text(
798
'Note: For the Delphi compiler, which was found on your system,'#13 +
799
'helper utility assumes, that the system libraries needed for'#13 +
800
'successful compilation are located in the parallel directory'#13 +
801
'"..\lib" of the particular Delphi compiler path.' );
804
appl.m_dlg_found_some.append_text(
806
'Note: For the Free Pascal compiler, which was found on your system,'#13 +
807
'helper utility assumes, that the system libraries needed for'#13 +
808
'successful compilation are located in the parallel directory'#13 +
809
'"..\units\i386-win32" of the particular Free Pascal compiler path.' );
813
appl.m_dlg_found_some.append_text(
815
'NO batch files for compiling the ' + g_appl + ' demos'#13 +
816
'were created in the directory, from which this helper'#13 +
817
'utility was run, because no *.dpr projects were found.' );
824
{ action_set_drives }
825
function action_set_drives(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
831
drive_type ,i ,count : unsigned;
834
// Scan for drives in the system
840
path :=letter + ':\'#0;
843
drive_type:=GetDriveType(@path[1 ] );
846
DRIVE_FIXED : drive:='fixed harddrive';
847
DRIVE_REMOVABLE : drive:='removable drive';
848
DRIVE_REMOTE : drive:='network or remote drive';
849
DRIVE_CDROM : drive:='CD-ROM drive';
850
DRIVE_RAMDISK : drive:='RAM disk';
856
drive:=' ' + StrPas(@path[1 ] ) + ' (' + drive + ')' + #0;
858
appl.m_dlg_set_drives.add_choice(@drive[1 ] ,@path[1 ] ,30 ,360 - count * 30 ,count = 0 );
864
inc(byte(letter[1 ] ) );
868
appl.m_cur_dlg:=@appl.m_dlg_set_drives;
875
{ action_while_search }
876
function action_while_search(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
886
if appl.m_ShLast <> appl.m_DoShow then
891
' ' + appl.m_DoShow + #13#13 +
892
'Compilers found: ' + text + #0;
894
//rgba.ConstrDbl(0 ,0 ,0.5 );
896
appl.m_dlg_searching.change_text(@text[1 ] ,10 ,320 );
899
appl.m_ShLast:=appl.m_DoShow;
908
function process_file(file_name : shortstring ) : boolean;
910
if g_found < g_max then
912
g_search_results[g_found ]:=file_name;
921
function scan_files(files : shortstring; appl : the_application_ptr ) : boolean;
926
find ,file_path ,file_name ,file_ext : shortstring;
931
{ Scan dirs and go further }
932
spread_name(files ,file_path ,file_name ,file_ext );
938
appl.m_DoShow:=file_path;
942
err:=SysUtils.FindFirst(str_dir(file_path ) + '*' ,faDirectory ,SR );
946
if appl.m_DoQuit then
948
SysUtils.FindClose(SR );
954
if (SR.Name <> '.' ) and
955
(SR.Name <> '..' ) and
956
(SR.Attr and faDirectory = faDirectory ) then
958
spread_name(files ,file_path ,file_name ,file_ext );
960
if not scan_files(fold_name(str_dir(file_path ) + SR.Name + '\' ,file_name ,file_ext ) ,appl ) then
965
err:=SysUtils.FindNext(SR );
969
SysUtils.FindClose(SR );
971
{ Scan files for Delphi compiler }
972
find:=fold_name(file_path ,'dcc32' ,'*.exe' );
974
err:=SysUtils.FindFirst(find ,faArchive ,SR );
978
if appl.m_DoQuit then
980
SysUtils.FindClose(SR );
986
process_file(fold_name(files ,SR.Name ,SR.Name ) );
988
err:=SysUtils.FindNext(SR );
992
SysUtils.FindClose(SR );
994
{ Scan files for FPC compiler }
995
find:=fold_name(file_path ,'ppc386' ,'*.exe' );
997
err:=SysUtils.FindFirst(find ,faArchive ,SR );
1001
if appl.m_DoQuit then
1003
SysUtils.FindClose(SR );
1009
process_file(fold_name(files ,SR.Name ,SR.Name ) );
1011
err:=SysUtils.FindNext(SR );
1015
SysUtils.FindClose(SR );
1023
procedure FnSearch(appl : the_application_ptr );
1033
// OK, Go through selected drives and issue search
1034
appl.m_dlg_searching.set_waiting(@action_while_search );
1036
if appl.m_dlg_set_drives.m_num_choices > 0 then
1037
for i:=0 to appl.m_dlg_set_drives.m_num_choices - 1 do
1038
if appl.m_dlg_set_drives.m_choices[i ].ctrl._status then
1039
if not scan_files(appl.m_dlg_set_drives.m_choices[i ].attr ,appl ) then
1042
appl.m_dlg_searching.set_waiting(NIL );
1044
// Were we forced to quit ?
1045
if appl.m_DoQuit then
1048
// Depending on the search result activate the next user dialog
1051
action_configure(appl ,NIL );
1053
appl.m_cur_dlg:=@appl.m_dlg_found_some;
1057
appl.m_cur_dlg:=@appl.m_dlg_not_found;
1062
function ThSearch(Parameter : pointer ): integer;
1065
while the_application_ptr(Parameter ).m_Thread = 0 do;
1068
FnSearch(Parameter );
1071
the_application_ptr(Parameter ).m_Thread:=0;
1072
the_application_ptr(Parameter ).m_ApplID:=0;
1079
{ action_begin_search }
1080
function action_begin_search(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
1087
// Check, if we have drives to search
1088
if appl.m_dlg_set_drives.m_num_choices > 0 then
1089
for i:=0 to appl.m_dlg_set_drives.m_num_choices - 1 do
1090
if appl.m_dlg_set_drives.m_choices[i ].ctrl._status then
1100
appl.m_dlg_set_drives.m_actions[0 ].ctrl.cur_item_(-1 );
1101
appl.m_dlg_set_drives.set_next_status(ds_waiting_input );
1108
// Go on to search dialog
1109
appl.m_cur_dlg:=@appl.m_dlg_searching;
1111
// Start Up the search thread
1112
appl.m_Thread:=BeginThread(NIL ,65536 ,ThSearch ,appl ,0 ,appl.m_ApplID );
1116
{ action_stop_search }
1117
function action_stop_search(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
1119
appl.m_DoQuit:=true;
1124
function action_exit(appl : the_application_ptr; sender : dialog_ptr ) : boolean;
1131
constructor the_application.Construct;
1136
inherited Construct(format_ ,flip_y_ );
1150
m_dlg_welcome.Construct(
1152
'Welcome to the ' + g_full + '.'#13 +
1154
'This helper utility will scan your system to search'#13 +
1155
'for all available Object Pascal compilers.'#13 +
1157
'It will also create appropriate batch files with current'#13 +
1158
'paths and options needed to compile properly all'#13 +
1159
'the ' + g_appl + ' demos.'#13+
1161
'Currently Delphi and Free Pascal compilers are supported.' );
1163
m_dlg_welcome.add_action('Continue' ,@action_set_drives ,480 ,15 ,580 ,45 );
1165
// Set drives to search on dialog
1166
m_dlg_set_drives.Construct(
1168
'Please select, on which drives of your system should'#13 +
1169
'this helper utility perform search for Object Pascal compilers:' );
1171
m_dlg_set_drives.add_action('Continue' ,@action_begin_search ,480 ,15 ,580 ,45 );
1173
// Wait, searching dialog
1174
m_dlg_searching.Construct(
1176
'Please wait ...'#13 +
1178
'Helper utility is searching for Object Pascal compilers'#13 +
1179
'on the drives, you have selected.' );
1181
m_dlg_searching.add_action('Stop searching' ,@action_stop_search ,440 ,15 ,580 ,45 );
1183
// Found nothing dialog
1184
rgba.ConstrInt(255 ,0 ,0 );
1186
m_dlg_not_found.Construct(
1188
'I am sorry, but NO Object Pascal compilers were found'#13 +
1189
'on your system.'#13 +
1191
'Please install Delphi or FreePascal'#13+
1192
'and then rerun this utility.'#13#13+
1193
'http://www.borland.com'#13#13 +
1195
'http://www.freepascal.org' ,
1198
m_dlg_not_found.add_action('Exit' ,@action_exit ,500 ,15 ,580 ,45 );
1200
// Compilers found dialog
1201
rgba.ConstrDbl(0 ,0.5 ,0 );
1203
m_dlg_found_some.Construct(
1205
'Following Object Pascal compilers were found your system:' ,
1208
m_dlg_found_some.add_action('Exit' ,@action_exit ,500 ,15 ,580 ,45 );
1213
destructor the_application.Destruct;
1215
while m_Thread <> 0 do
1223
m_dlg_welcome.Destruct;
1224
m_dlg_set_drives.Destruct;
1225
m_dlg_searching.Destruct;
1226
m_dlg_not_found.Destruct;
1227
m_dlg_found_some.Destruct;
1232
procedure the_application.draw_text;
1234
pixf : pixel_formats;
1238
rs : renderer_scanline_aa_solid;
1244
pixfmt_bgr24(pixf ,rbuf_window );
1246
rb.Construct(@pixf );
1256
t.start_point_(x ,y );
1263
rgba.ConstrDbl(0 ,0 ,0 );
1268
m_ras.add_path (@pt );
1269
render_scanlines(@m_ras ,@m_sl ,@rs );
1277
procedure the_application.on_init;
1282
find ,file_path ,file_name ,file_ext : shortstring;
1288
target ,get : shortstring;
1293
// Load the list of current projects
1296
spread_name(ParamStr(0 ) ,file_path ,file_name ,file_ext );
1298
find:=fold_name(file_path ,'*' ,'*.dpr' );
1299
err :=SysUtils.FindFirst(find ,faArchive ,SR );
1303
// Load keys from the source file
1306
get:=fold_name(file_path ,SR.Name ,SR.Name );
1308
AssignFile(cf ,SR.Name );
1311
if IOResult = 0 then
1313
sz:=System.FileSize(cf );
1315
if agg_getmem(bf ,sz ) then
1317
blockread (cf ,bf^ ,sz );
1319
agg_freemem(bf ,sz );
1329
FirstKey('target' ,target );
1332
if (cmp_str(target ) <> cmp_str('win' ) ) or
1333
FirstKey('skip' ,get ) then
1336
if g_num_demos < g_max_demos then
1338
g_demos[g_num_demos ]:=fold_name('' ,SR.Name ,SR.Name );
1344
err:=SysUtils.FindNext(SR );
1348
SysUtils.FindClose(SR );
1353
procedure the_application.on_draw;
1355
pixf : pixel_formats;
1359
rs : renderer_scanline_aa_solid;
1364
// Initialize structures
1365
pixfmt_bgr24(pixf ,rbuf_window );
1367
rb.Construct(@pixf );
1370
rgba.ConstrDbl(1 ,1 ,1 );
1374
if m_cur_dlg <> NIL then
1375
case m_cur_dlg.m_status of
1376
ds_waiting_input ,ds_running :
1378
// Render logo if has one
1381
if (m_cur_dlg = @m_dlg_welcome ) and
1384
rb.copy_from(rbuf_img(1 ) ,NIL ,6 ,330 );
1386
plus:=rbuf_img(1 )._height + 20;
1391
draw_text(10 ,420 - plus ,m_cur_dlg.m_info ,@m_cur_dlg.m_clri );
1393
// Render dynamic text
1394
if m_cur_dlg.m_text <> NIL then
1398
PChar(m_cur_dlg.m_text ) ,
1399
@m_cur_dlg.m_clrt );
1402
if m_cur_dlg.m_num_choices > 0 then
1403
for i:=0 to m_cur_dlg.m_num_choices - 1 do
1404
render_ctrl(@m_ras ,@m_sl ,@rs ,@m_cur_dlg.m_choices[i ] );
1407
if m_cur_dlg.m_num_actions > 0 then
1408
for i:=0 to m_cur_dlg.m_num_actions - 1 do
1409
render_ctrl(@m_ras ,@m_sl ,@rs ,@m_cur_dlg.m_actions[i ].ctrl );
1418
procedure the_application.on_ctrl_change;
1420
if m_cur_dlg <> NIL then
1421
case m_cur_dlg.m_status of
1423
if m_cur_dlg.find_cur_action then
1424
m_cur_dlg.set_next_status;
1431
procedure the_application.on_idle;
1433
if m_cur_dlg = NIL then
1435
m_cur_dlg:=@m_dlg_welcome;
1437
if m_cur_dlg.m_status <> ds_ready then
1442
case m_cur_dlg.m_status of
1444
if m_cur_dlg.add_controls then
1448
m_cur_dlg.call_waiting;
1451
if m_cur_dlg.call_cur_action then
1459
procedure the_application.on_key;
1461
if key = key_f1 then
1463
'This is just an AggPas library helper utility which has nothing to do'#13 +
1464
'with demonstrating any of graphical possibilities of AGG.'#13#13 +
1465
'Author of this pascal port (Milano) recomends to proceed with this utility'#13 +
1466
'on your system right after unpacking the archive, because it will'#13 +
1467
'scan your computer for all available Object Pascal compilers and'#13 +
1468
'it will create the up-to-date working batch files for fompiling the library demos.'#13#13 +
1469
'In the welcome screen of this utility, there is a logo for the AGG library,'#13 +
1470
'which was designed and proposed by Milano. It has the meaning of spiral primitive'#13 +
1471
'upon the interactive polygon control, which should mean in "translation" that'#13 +
1472
'"With AGG the possibilities are endless (the spiral) and custom adjustments'#13 +
1473
'are easy possible. (interactive polygon)".' +
1474
#13#13'Note: F2 key saves current "screenshot" file in this demo''s directory. ' );
1479
app : the_application;
1485
app.Construct(pix_format_bgr24 ,flip_y );
1486
app.caption_ (g_appl + ' Startup utility (F1-Help)' );
1488
if app.load_img(1 ,'aggpas_logo' ) then
1491
if app.init(600 ,450 ,0 ) then
b'\\ No newline at end of file'