{mac_copy:spheres2.bmp} // // AggPas 2.4 RM3 Demo application // Note: Press F1 key on run to see more info about this demo // // Paths: ..\;..\ctrl;..\svg;..\util;..\platform\win;expat-wrap // program Agg2DDemo ; uses SysUtils , agg_basics , agg_platform_support , file_utils_ , agg_2D ; {$I agg_mode.inc } const flip_y = true; angle_step = 5; gamma_step = 0.1; var FONT_TIMES : AnsiString = 'Times New Roman'; FONT_ARIAL : AnsiString = 'Arial'; FONT_VERDA : AnsiString = 'Verdana'; type the_application = object(platform_support ) m_graphics , m_timer : Agg2D; m_angle , m_gamma : double; m_image : int; m_gmText : AnsiString; constructor Construct(format_ : pix_format_e; flip_y_ : boolean ); destructor Destruct; procedure on_init; virtual; procedure on_draw; virtual; procedure on_mouse_move(x ,y : int; flags : unsigned ); virtual; procedure on_mouse_button_down(x ,y : int; flags : unsigned ); virtual; procedure on_mouse_button_up (x ,y : int; flags : unsigned ); virtual; procedure on_key(x ,y : int; key ,flags : unsigned ); virtual; end; { CONSTRUCT } constructor the_application.Construct; begin inherited Construct(format_ ,flip_y_ ); m_graphics.Construct; m_timer.Construct; m_angle:=0; m_gamma:=1.4; m_image:=6; Str(m_gamma:0:2 ,m_gmText ); m_gmText:='Gamma: ' + m_gmText; end; { DESTRUCT } destructor the_application.Destruct; begin inherited Destruct; m_graphics.Destruct; m_timer.Destruct; Finalize(m_gmText ); end; { ON_INIT } procedure the_application.on_init; begin end; { ON_DRAW } procedure the_application.on_draw; var xb1 ,yb1 ,xb2 ,yb2 : double; clr ,c1 ,c2 ,c3 : Color; img : Image; parl : array[0..5 ] of double; poly : array[0..11 ] of double; tm : double; fps : int; timer ,rate : AnsiString; begin start_timer; m_graphics.attach( rbuf_window._buf , rbuf_window._width , rbuf_window._height , rbuf_window._stride ); m_graphics.clearAll(255 ,255 ,255 ); //m_graphics.clearAll(0 ,0 ,0 ); //m_graphics.blendMode(BlendSub ); //m_graphics.blendMode(BlendAdd ); m_graphics.antiAliasGamma(m_gamma ); // Set flipText(true) if you have the Y axis upside down. m_graphics.flipText(not flip_y ); // ClipBox. //m_graphics.clipBox(50 ,50 ,rbuf_window._width - 50 ,rbuf_window._height - 50 ); // Transfornations - Rotate around (300,300) to 5 degree m_graphics.translate(-300 ,-300 ); m_graphics.rotate (deg2Rad(m_angle ) ); m_graphics.translate(300 ,300 ); //m_graphics.skew (0.1 ,0.1 ); // Viewport - set 0,0,600,600 to the actual window size // preserving aspect ratio and placing the viewport in the center. // To ignore aspect ratio use Agg2D::Anisotropic // Note that the viewport just adds transformations to the current // affine matrix. So that, set the viewport *after* all transformations! m_graphics.viewport( 0 ,0 ,600 ,600 , 0 ,0 ,_width ,_height , //Anisotropic ); XMidYMid ); //XMinYMin ); //XMidYMin ); //XMaxYMin ); //XMinYMid ); //XMaxYMid ); //XMinYMax ); //XMidYMax ); //XMaxYMax ); // Rounded Rect m_graphics.lineColor(0 ,0 ,0 ); m_graphics.noFill; m_graphics.roundedRect(0.5 ,0.5 ,600 - 0.5 ,600 - 0.5 ,20.0 ); // Regular Text { m_graphics.font(char_ptr(FONT_TIMES ) ,14.0 ,false ,false ); m_graphics.fillColor(0 ,0 ,0 ); m_graphics.noLine; m_graphics.text(100 ,20 ,char_ptr(PChar('Regular Raster Text -- Fast, but can''t be rotated' ) ) ); } // Outlined Text m_graphics.font(char_ptr(FONT_TIMES ) ,50.0 ,false ,false ,{RasterFontCache}VectorFontCache ); m_graphics.lineColor(50 ,0 ,0 ); m_graphics.fillColor(180 ,200 ,100 ); m_graphics.lineWidth(1.0 ); m_graphics.text(100.5 ,50.5 ,char_ptr(PChar('Outlined Text' ) ) ); // Gamma Text (* m_graphics.font(char_ptr(FONT_ARIAL ) ,38.0 ,true ,true ,VectorFontCache ); c1.Construct (255 ,0 ,0 ,255 ); c2.Construct (0 ,255 ,0 ,255 ); m_graphics.fillLinearGradient(50 ,1 ,300 ,10 ,c1 ,c2 ); m_graphics.noLine; m_graphics.text(12.5 ,565.5 ,char_ptr(@m_gmText[1 ] ) ); //m_graphics.rectangle(12.5 ,565.5 ,290 ,590 ); *) // Text Alignment m_graphics.lineColor(0 ,0 ,0 ); m_graphics.line(250.5 - 150 ,150.5 ,250.5 + 150 ,150.5 ); m_graphics.line(250.5 ,150.5 - 20 ,250.5 ,150.5 + 20 ); m_graphics.line(250.5 - 150 ,200.5 ,250.5 + 150 ,200.5 ); m_graphics.line(250.5 ,200.5 - 20 ,250.5 ,200.5 + 20 ); m_graphics.line(250.5 - 150 ,250.5 ,250.5 + 150 ,250.5 ); m_graphics.line(250.5 ,250.5 - 20 ,250.5 ,250.5 + 20 ); m_graphics.line(250.5 - 150 ,300.5 ,250.5 + 150 ,300.5 ); m_graphics.line(250.5 ,300.5 - 20 ,250.5 ,300.5 + 20 ); m_graphics.line(250.5 - 150 ,350.5 ,250.5 + 150 ,350.5 ); m_graphics.line(250.5 ,350.5 - 20 ,250.5 ,350.5 + 20 ); m_graphics.line(250.5 - 150 ,400.5 ,250.5 + 150 ,400.5 ); m_graphics.line(250.5 ,400.5 - 20 ,250.5 ,400.5 + 20 ); m_graphics.line(250.5 - 150 ,450.5 ,250.5 + 150 ,450.5 ); m_graphics.line(250.5 ,450.5 - 20 ,250.5 ,450.5 + 20 ); m_graphics.line(250.5 - 150 ,500.5 ,250.5 + 150 ,500.5 ); m_graphics.line(250.5 ,500.5 - 20 ,250.5 ,500.5 + 20 ); m_graphics.line(250.5 - 150 ,550.5 ,250.5 + 150 ,550.5 ); m_graphics.line(250.5 ,550.5 - 20 ,250.5 ,550.5 + 20 ); m_graphics.fillColor(100 ,50 ,50 ); m_graphics.noLine; //m_graphics.textHints(false ); m_graphics.font(char_ptr(FONT_TIMES ) ,40.0 ,false ,false ,VectorFontCache ); m_graphics.textAlignment(AlignLeft ,AlignBottom ); m_graphics.text(250.0 ,150.0 ,char_ptr(PChar('Left-Bottom' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignCenter ,AlignBottom ); m_graphics.text(250.0 ,200.0 ,char_ptr(PChar('Center-Bottom' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignRight ,AlignBottom ); m_graphics.text(250.0 ,250.0 ,char_ptr(PChar('Right-Bottom' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignLeft ,AlignCenter ); m_graphics.text(250.0 ,300.0 ,char_ptr(PChar('Left-Center' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignCenter ,AlignCenter ); m_graphics.text(250.0 ,350.0 ,char_ptr(PChar('Center-Center' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignRight ,AlignCenter ); m_graphics.text(250.0 ,400.0 ,char_ptr(PChar('Right-Center' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignLeft ,AlignTop ); m_graphics.text(250.0 ,450.0 ,char_ptr(PChar('Left-Top' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignCenter ,AlignTop ); m_graphics.text(250.0 ,500.0 ,char_ptr(PChar('Center-Top' ) ) ,true ,0 ,0 ); m_graphics.textAlignment(AlignRight ,AlignTop ); m_graphics.text(250.0 ,550.0 ,char_ptr(PChar('Right-Top' ) ) ,true ,0 ,0 ); // Gradients (Aqua Buttons) //======================================= m_graphics.font(char_ptr(FONT_VERDA ) ,20.0 ,false ,false ,VectorFontCache ); xb1:=400; yb1:=80; xb2:=xb1 + 150; yb2:=yb1 + 36; clr.Construct (0 ,50 ,180 ,180 ); m_graphics.fillColor (clr ); clr.Construct (0 ,0 ,80 ,255 ); m_graphics.lineColor (clr ); m_graphics.lineWidth (1.0); m_graphics.roundedRect(xb1 ,yb1 ,xb2 ,yb2 ,12 ,18 ); clr.Construct (0 ,0 ,0 ,0 ); m_graphics.lineColor(clr ); c1.Construct (100 ,200 ,255 ,255 ); c2.Construct (255 ,255 ,255 ,0 ); m_graphics.fillLinearGradient(xb1 ,yb1 ,xb1 ,yb1 + 30 ,c1 ,c2 ); m_graphics.roundedRect (xb1 + 3 ,yb1 + 2.5 ,xb2 - 3 ,yb1 + 30 ,9 ,18 ,1 ,1 ); clr.Construct (0 ,0 ,50 ,200 ); m_graphics.fillColor(clr ); m_graphics.noLine; m_graphics.textAlignment(AlignCenter ,AlignCenter ); m_graphics.text( (xb1 + xb2 ) / 2.0 , (yb1 + yb2 ) / 2.0 , char_ptr(PChar('Aqua Button' ) ) , true ,0.0 ,0.0 ); c1.Construct(0 ,0 ,255 ,0 ); c2.Construct(100 ,255 ,255 ,255 ); m_graphics.fillLinearGradient(xb1 ,yb2 - 20 ,xb1 ,yb2 - 3 ,c1 ,c2 ); m_graphics.roundedRect (xb1 + 3 ,yb2 - 20 ,xb2 - 3 ,yb2 - 2 ,1 ,1 ,9 ,18 ); // Aqua Button Pressed xb1:=400; yb1:=30; xb2:=xb1 + 150; yb2:=yb1 + 36; clr.Construct (0 ,50 ,180 ,180 ); m_graphics.fillColor (clr ); clr.Construct (0 ,0 ,0 ,255 ); m_graphics.lineColor (clr ); m_graphics.lineWidth (2.0 ); m_graphics.roundedRect(xb1 ,yb1 ,xb2 ,yb2 ,12 ,18 ); clr.Construct (0 ,0 ,0 ,0 ); m_graphics.lineColor(clr ); c1.Construct (60 ,160 ,255 ,255 ); c2.Construct (100 ,255 ,255 ,0 ); m_graphics.fillLinearGradient(xb1 ,yb1 + 2 ,xb1 ,yb1 + 25 ,c1 ,c2 ); m_graphics.roundedRect (xb1 + 3 ,yb1 + 2.5 ,xb2 - 3 ,yb1 + 30 ,9 ,18 ,1 ,1 ); clr.Construct (0 ,0 ,50 ,255 ); m_graphics.fillColor(clr ); m_graphics.noLine; m_graphics.textAlignment(AlignCenter ,AlignCenter ); m_graphics.text( (xb1 + xb2 ) / 2.0 , (yb1 + yb2 ) / 2.0 , char_ptr(PChar('Aqua Pressed' ) ) , false ,0.0 ); c1.Construct (0 ,180 ,255 ,0 ); c2.Construct (0 ,200 ,255 ,255 ); m_graphics.fillLinearGradient(xb1 ,yb2 - 25 ,xb1 ,yb2 - 5 ,c1 ,c2 ); m_graphics.roundedRect (xb1 + 3 ,yb2 - 25 ,xb2 - 3 ,yb2 - 2 ,1 ,1 ,9 ,18 ); // Basic Shapes -- Ellipse //=========================================== m_graphics.lineWidth(3.5 ); m_graphics.lineColor(20 ,80 ,80 ); m_graphics.fillColor(200 ,255 ,80 ,200 ); m_graphics.ellipse (450 ,200 ,50 ,90 ); // Paths //=========================================== m_graphics.resetPath; m_graphics.fillColor (255 ,0 ,0 ,100 ); m_graphics.lineColor (0 ,0 ,255 ,100 ); m_graphics.lineWidth (2 ); m_graphics.moveTo (300 / 2 ,200 / 2 ); m_graphics.horLineRel(-150 / 2 ); m_graphics.arcRel (150 / 2 ,150 / 2 ,0 ,true ,false ,150 / 2 ,-150 / 2 ); m_graphics.closePolygon; m_graphics.drawPath; m_graphics.resetPath; m_graphics.fillColor (255 ,255 ,0 ,100 ); m_graphics.lineColor (0 ,0 ,255 ,100 ); m_graphics.lineWidth (2 ); m_graphics.moveTo (275 / 2 ,175 / 2 ); m_graphics.verLineRel(-150 / 2 ); m_graphics.arcRel (150 / 2 ,150 / 2 ,0 ,false ,false ,-150 / 2 ,150 / 2 ); m_graphics.closePolygon; m_graphics.drawPath; m_graphics.resetPath; m_graphics.noFill; m_graphics.lineColor(127 ,0 ,0 ); m_graphics.lineWidth(5 ); m_graphics.moveTo (600 / 2 ,350 / 2 ); m_graphics.lineRel (50 / 2 ,-25 / 2 ); m_graphics.arcRel (25 / 2 ,25 / 2 ,deg2Rad(-30 ) ,false ,true ,50 / 2 ,-25 / 2 ); m_graphics.lineRel (50 / 2 ,-25 / 2); m_graphics.arcRel (25 / 2 ,50 / 2 ,deg2Rad(-30 ) ,false ,true ,50 / 2 ,-25 / 2 ); m_graphics.lineRel (50 / 2 ,-25 / 2 ); m_graphics.arcRel (25 / 2 ,75 / 2 ,deg2Rad(-30 ) ,false ,true ,50 / 2 ,-25 / 2 ); m_graphics.lineRel (50 ,-25 ); m_graphics.arcRel (25 / 2 ,100 / 2 ,deg2Rad(-30 ) ,false ,true ,50 / 2 ,-25 / 2 ); m_graphics.lineRel (50 / 2 ,-25 / 2 ); m_graphics.drawPath; // Master Alpha. From now on everything will be translucent //=========================================== m_graphics.masterAlpha(0.85 ); // Image Transformations //=========================================== img.Construct( rbuf_img(0 )._buf , rbuf_img(0 )._width , rbuf_img(0 )._height , rbuf_img(0 )._stride ); m_graphics.imageFilter(Bilinear ); //m_graphics.imageResample(NoResample ); //m_graphics.imageResample(ResampleAlways ); m_graphics.imageResample(ResampleOnZoomOut ); // Set the initial image blending operation as BlendDst, that actually // does nothing. //----------------- m_graphics.imageBlendMode(BlendDst ); // Transform the whole image to the destination rectangle //----------------- if m_image = 1 then m_graphics.transformImage(@img ,450 ,200 ,595 ,350 );{1} // Transform the rectangular part of the image to the destination rectangle //----------------- if m_image = 2 then m_graphics.transformImage( @img ,60 ,60 ,img.width - 60 ,img.height - 60 , 450 ,200 ,595 ,350 );{2} // Transform the whole image to the destination parallelogram //----------------- if m_image = 3 then begin parl[0 ]:=450; parl[1 ]:=200; parl[2 ]:=595; parl[3 ]:=220; parl[4 ]:=575; parl[5 ]:=350; m_graphics.transformImage(@img ,@parl[0 ] );{3} end; // Transform the rectangular part of the image to the destination parallelogram //----------------- if m_image = 4 then begin parl[0 ]:=450; parl[1 ]:=200; parl[2 ]:=595; parl[3 ]:=220; parl[4 ]:=575; parl[5 ]:=350; m_graphics.transformImage(@img ,60 ,60 ,img.width - 60 ,img.height - 60 ,@parl[0 ] );{4} end; // Transform image to the destination path. The scale is determined by a rectangle //----------------- if m_image = 5 then begin m_graphics.resetPath; m_graphics.moveTo (450 ,200 ); m_graphics.cubicCurveTo (595 ,220 ,575 ,350 ,595 ,350 ); m_graphics.lineTo (470 ,340 ); m_graphics.transformImagePath(@img ,450 ,200 ,595 ,350 );{5} end; // Transform image to the destination path. // The scale is determined by a rectangle //----------------- if m_image = 6 then begin m_graphics.resetPath; m_graphics.moveTo (450 ,200 ); m_graphics.cubicCurveTo(595 ,220 ,575 ,350 ,595 ,350 ); m_graphics.lineTo (470 ,340 ); m_graphics.transformImagePath( @img ,60 ,60 ,img.width - 60 ,img.height - 60 , 450 ,200 ,595 ,350 );{6} end; // Transform image to the destination path. // The transformation is determined by a parallelogram if m_image = 7 then begin m_graphics.resetPath; m_graphics.moveTo (450 ,200 ); m_graphics.cubicCurveTo(595 ,220 ,575 ,350 ,595 ,350 ); m_graphics.lineTo (470 ,340 ); parl[0 ]:=450; parl[1 ]:=200; parl[2 ]:=595; parl[3 ]:=220; parl[4 ]:=575; parl[5 ]:=350; m_graphics.transformImagePath(@img ,@parl[0 ] );{7} end; // Transform the rectangular part of the image to the destination path. // The transformation is determined by a parallelogram if m_image = 8 then begin m_graphics.resetPath; m_graphics.moveTo (450 ,200 ); m_graphics.cubicCurveTo(595 ,220 ,575 ,350 ,595 ,350 ); m_graphics.lineTo (470 ,340 ); parl[0 ]:=450; parl[1 ]:=200; parl[2 ]:=595; parl[3 ]:=220; parl[4 ]:=575; parl[5 ]:=350; m_graphics.transformImagePath(@img ,60 ,60 ,img.width - 60 ,img.height - 60 ,@parl[0 ] );{8} end; // Free Image img.Destruct; // Add/Sub/Contrast Blending Modes m_graphics.noLine; m_graphics.fillColor(70 ,70 ,0 ); m_graphics.blendMode(BlendAdd ); m_graphics.ellipse (500 ,280 ,20 ,40 ); m_graphics.fillColor(255 ,255 ,255 ); m_graphics.blendMode(BlendContrast ); m_graphics.ellipse (500 + 40 ,280 ,20 ,40 ); // Radial gradient. m_graphics.blendMode (BlendAlpha ); c1.Construct (255 ,255 ,0 , 0); c2.Construct (0 ,0 ,127 ); c3.Construct (0 ,255 ,0 , 0); m_graphics.fillRadialGradient(400 ,500 ,40 ,c1 ,c2 ,c3 ); m_graphics.ellipse (400 ,500 ,40 ,40 ); // More ... (* m_graphics.masterAlpha(1 ); //m_graphics.lineColor(50 ,60 ,70 ); c1.Construct (255 ,0 ,0 ,255 ); c2.Construct (0 ,255 ,0 ,255 ); m_graphics.lineLinearGradient(0 ,0 ,500 ,0 ,c1 ,c2 );{} m_graphics.fillColor(255 ,0 ,0 ); m_graphics.lineJoin (JoinMiter ); m_graphics.lineWidth(15 ); m_graphics.triangle (10 ,10 ,100 ,20 ,50 ,150 ); m_graphics.lineJoin (JoinRound ); m_graphics.lineWidth(4 ); m_graphics.noFill; m_graphics.rectangle(55 ,540 ,135 ,495 ); m_graphics.masterAlpha(0.5 ); m_graphics.fillColor(255 ,127 ,65 ); m_graphics.star (300 ,300 ,30 ,70 ,55 ,5 ); m_graphics.arc (400 ,400 ,30 ,30 ,300 ,1150 ); m_graphics.lineWidth(20 ); m_graphics.lineCap (CapRound ); m_graphics.curve (80 ,400 ,90 ,220 ,190 ,390 ); m_graphics.curve (80 ,500 ,90 ,320 ,190 ,490 ,310 ,330 ); poly[0 ]:=400; poly[1 ]:=580; poly[2 ]:=530; poly[3 ]:=400; poly[4 ]:=590; poly[5 ]:=500; poly[6 ]:=450; poly[7 ]:=380; poly[8 ]:=490; poly[9 ]:=570; poly[10 ]:=420; poly[11 ]:=420; m_graphics.fillEvenOdd(false ); m_graphics.lineWidth (3 ); m_graphics.polygon (@poly[0 ] ,6 ); m_graphics.lineColor(221 ,160 ,221 ); m_graphics.lineWidth(6 ); m_graphics.polyline (@poly[0 ] ,6 ); *) // TIMER DRAW // ---------- tm:=elapsed_time; m_timer.attach( rbuf_window._buf , rbuf_window._width , rbuf_window._height , rbuf_window._stride ); m_timer.antiAliasGamma(1.4 ); m_timer.flipText(not flip_y ); m_timer.viewport( 0 ,0 ,600 ,600 , 0 ,0 ,_width ,_height , //Anisotropic ); XMidYMid ); Str(tm:0:2 ,timer ); timer:='Frame time: ' + timer + ' ms'; fps:=Trunc(1000 / tm ); Str(fps ,rate ); timer:=timer + ' (' + rate + ' FPS)'; m_timer.font(char_ptr(FONT_ARIAL ) ,15.0 ,true ,false ,VectorFontCache ); m_timer.noLine; m_timer.fillColor(255 ,0 ,0 ); m_timer.text(350 ,8 ,char_ptr(@timer[1 ] ) ); end; { ON_MOUSE_MOVE } procedure the_application.on_mouse_move; begin end; { ON_MOUSE_BUTTON_DOWN } procedure the_application.on_mouse_button_down; begin end; { ON_MOUSE_BUTTON_UP } procedure the_application.on_mouse_button_up; begin end; { ON_KEY } procedure the_application.on_key; begin if key = key_f1 then message_( '"Quick and dirty prototype" of 2D drawing API for AGG.'#13#13 + 'Written and published by Maxim Shemanarev (c) 2005 - 2006. '#13 + 'Ported to Object Pascal by Milan Marusinec (c) 2007.'#13#13 + 'How to play with:'#13#13 + 'Key Down - Rotate clockwise'#13 + 'Key Up - Rotate counterclockwise'#13 + 'Key Right - Next image transformation'#13 + 'Key Left - Previous image transformation'#13 + 'Key Plus - Increase gamma'#13 + 'Key Minus - Decrease gamma' ); if key = key_down then begin m_angle:=m_angle - angle_step; if m_angle < 0 then m_angle:=360 - angle_step; force_redraw; end; if key = key_up then begin m_angle:=m_angle + angle_step; if m_angle > 360 then m_angle:=angle_step; force_redraw; end; if key = key_right then begin inc(m_image ); if m_image > 8 then m_image:=1; force_redraw; end; if key = key_left then begin dec(m_image ); if m_image < 1 then m_image:=8; force_redraw; end; if key = key_kp_plus then begin m_gamma:=m_gamma + gamma_step; Str(m_gamma:0:2 ,m_gmText ); m_gmText:='Gamma: ' + m_gmText; force_redraw; end; if key = key_kp_minus then begin m_gamma:=m_gamma - gamma_step; Str(m_gamma:0:2 ,m_gmText ); m_gmText:='Gamma: ' + m_gmText; force_redraw; end; end; VAR app : the_application; buf : array [0..255 ] of char; ext : string[10 ]; img_name ,p ,n ,x : shortstring; BEGIN if Agg2DUsesFreeType then begin FONT_TIMES:='times.ttf'; FONT_ARIAL:='arial.ttf'; FONT_VERDA:='verdana.ttf'; end; app.Construct(pix_format_bgra32 ,flip_y ); app.caption_ ('Agg2DDemo (F1-Help)' ); img_name:='spheres2'; {$IFDEF WIN32 } if ParamCount > 0 then begin spread_name(ParamStr(1 ) ,p ,n ,x ); img_name:=fold_name(p ,n ,'' ); end; {$ENDIF } if not app.load_img(0 ,img_name ) then begin img_name:=img_name + #0; ext :=app._img_ext + #0; if img_name = 'spheres2'#0 then begin sprintf(@buf[0 ] ,'File not found: %s' ,ptrcomp(@img_name[1 ] ) ); sprintf(@buf[StrLen(@buf ) ] ,'%s. '#13'Download http://www.antigrain.com/' ,ptrcomp(@ext[1 ] ) ); sprintf(@buf[StrLen(@buf ) ] ,'%s' ,ptrcomp(@img_name[1 ] ) ); sprintf(@buf[StrLen(@buf ) ] ,'%s'#13'or copy it from another directory if available.' ,ptrcomp(@ext[1 ] ) ); end else begin sprintf(@buf[0 ] ,'File not found: %s' ,ptrcomp(@img_name[1 ] ) ); sprintf(@buf[StrLen(@buf ) ] ,'%s' ,ptrcomp(@ext[1 ] ) ); end; app.message_(@buf[0 ] ); end else if app.init(600 ,600 ,window_resize ) then app.run; app.Destruct; end.