// // AggPas 2.4 RM3 Demo application // Note: Press F1 key on run to see more info about this demo // // Paths: src;src\ctrl;src\svg;src\util;src\platform\win;expat-wrap // program blend_color ; {DEFINE AGG_GRAY8 } {DEFINE AGG_BGR24 } {DEFINE AGG_RGB24 } {$DEFINE AGG_BGRA32 } {DEFINE AGG_RGBA32 } {DEFINE AGG_ARGB32 } {DEFINE AGG_ABGR32 } {DEFINE AGG_RGB565 } {DEFINE AGG_RGB555 } {$IFDEF AGG_GRAY8 } {$DEFINE AGG_PF8 } {$ELSE } {$IFDEF AGG_BGR24 } {$DEFINE AGG_PF24 } {$ELSE } {$IFDEF AGG_RGB24 } {$DEFINE AGG_PF24 } {$ELSE } {$IFDEF AGG_BGRA32 } {$DEFINE AGG_PF32 } {$ELSE } {$IFDEF AGG_RGBA32 } {$DEFINE AGG_PF32 } {$ELSE } {$IFDEF AGG_ARGB32 } {$DEFINE AGG_PF32 } {$ELSE } {$IFDEF AGG_ABGR32 } {$DEFINE AGG_PF32 } {$ELSE } {$IFDEF AGG_RGB555 } {$DEFINE AGG_PF16 } {$ELSE } {$IFDEF AGG_RGB565 } {$DEFINE AGG_PF16 } {$ELSE } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } {$ENDIF } uses agg_basics , {$IFNDEF AGG_PF8 } agg_pixfmt_gray , {$ENDIF } {$IFNDEF AGG_PF32 } agg_pixfmt_rgba , {$ENDIF } agg_array , agg_platform_support , agg_ctrl , agg_slider_ctrl , agg_rbox_ctrl , agg_cbox_ctrl , agg_polygon_ctrl , agg_renderer_base , agg_rendering_buffer , agg_rasterizer_scanline_aa , agg_conv_curve , agg_conv_contour , agg_conv_stroke , agg_conv_transform , agg_gsv_text , agg_scanline_p , agg_renderer_scanline , agg_bounding_rect , agg_trans_perspective , agg_blur , agg_path_storage , agg_trans_affine {$I pixel_formats.inc } {$I agg_mode.inc } const flip_y = true; g_gradient_colors : array[0..1023 ] of int8u = ( 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 254, 255, 255, 255, 254, 255, 255, 255, 253, 255, 255, 255, 253, 255, 255, 255, 252, 255, 255, 255, 251, 255, 255, 255, 250, 255, 255, 255, 248, 255, 255, 255, 246, 255, 255, 255, 244, 255, 255, 255, 241, 255, 255, 255, 238, 255, 255, 255, 235, 255, 255, 255, 231, 255, 255, 255, 227, 255, 255, 255, 222, 255, 255, 255, 217, 255, 255, 255, 211, 255, 255, 255, 206, 255, 255, 255, 200, 255, 255, 254, 194, 255, 255, 253, 188, 255, 255, 252, 182, 255, 255, 250, 176, 255, 255, 249, 170, 255, 255, 247, 164, 255, 255, 246, 158, 255, 255, 244, 152, 255, 254, 242, 146, 255, 254, 240, 141, 255, 254, 238, 136, 255, 254, 236, 131, 255, 253, 234, 126, 255, 253, 232, 121, 255, 253, 229, 116, 255, 252, 227, 112, 255, 252, 224, 108, 255, 251, 222, 104, 255, 251, 219, 100, 255, 251, 216, 96, 255, 250, 214, 93, 255, 250, 211, 89, 255, 249, 208, 86, 255, 249, 205, 83, 255, 248, 202, 80, 255, 247, 199, 77, 255, 247, 196, 74, 255, 246, 193, 72, 255, 246, 190, 69, 255, 245, 187, 67, 255, 244, 183, 64, 255, 244, 180, 62, 255, 243, 177, 60, 255, 242, 174, 58, 255, 242, 170, 56, 255, 241, 167, 54, 255, 240, 164, 52, 255, 239, 161, 51, 255, 239, 157, 49, 255, 238, 154, 47, 255, 237, 151, 46, 255, 236, 147, 44, 255, 235, 144, 43, 255, 235, 141, 41, 255, 234, 138, 40, 255, 233, 134, 39, 255, 232, 131, 37, 255, 231, 128, 36, 255, 230, 125, 35, 255, 229, 122, 34, 255, 228, 119, 33, 255, 227, 116, 31, 255, 226, 113, 30, 255, 225, 110, 29, 255, 224, 107, 28, 255, 223, 104, 27, 255, 222, 101, 26, 255, 221, 99, 25, 255, 220, 96, 24, 255, 219, 93, 23, 255, 218, 91, 22, 255, 217, 88, 21, 255, 216, 86, 20, 255, 215, 83, 19, 255, 214, 81, 18, 255, 213, 79, 17, 255, 212, 77, 17, 255, 211, 74, 16, 255, 210, 72, 15, 255, 209, 70, 14, 255, 207, 68, 13, 255, 206, 66, 13, 255, 205, 64, 12, 255, 204, 62, 11, 255, 203, 60, 10, 255, 202, 58, 10, 255, 201, 56, 9, 255, 199, 55, 9, 255, 198, 53, 8, 255, 197, 51, 7, 255, 196, 50, 7, 255, 195, 48, 6, 255, 193, 46, 6, 255, 192, 45, 5, 255, 191, 43, 5, 255, 190, 42, 4, 255, 188, 41, 4, 255, 187, 39, 3, 255, 186, 38, 3, 255, 185, 37, 2, 255, 183, 35, 2, 255, 182, 34, 1, 255, 181, 33, 1, 255, 179, 32, 1, 255, 178, 30, 0, 255, 177, 29, 0, 255, 175, 28, 0, 255, 174, 27, 0, 255, 173, 26, 0, 255, 171, 25, 0, 255, 170, 24, 0, 255, 168, 23, 0, 255, 167, 22, 0, 255, 165, 21, 0, 255, 164, 21, 0, 255, 163, 20, 0, 255, 161, 19, 0, 255, 160, 18, 0, 255, 158, 17, 0, 255, 156, 17, 0, 255, 155, 16, 0, 255, 153, 15, 0, 255, 152, 14, 0, 255, 150, 14, 0, 255, 149, 13, 0, 255, 147, 12, 0, 255, 145, 12, 0, 255, 144, 11, 0, 255, 142, 11, 0, 255, 140, 10, 0, 255, 139, 10, 0, 255, 137, 9, 0, 255, 135, 9, 0, 255, 134, 8, 0, 255, 132, 8, 0, 255, 130, 7, 0, 255, 128, 7, 0, 255, 126, 6, 0, 255, 125, 6, 0, 255, 123, 5, 0, 255, 121, 5, 0, 255, 119, 4, 0, 255, 117, 4, 0, 255, 115, 4, 0, 255, 113, 3, 0, 255, 111, 3, 0, 255, 109, 2, 0, 255, 107, 2, 0, 255, 105, 2, 0, 255, 103, 1, 0, 255, 101, 1, 0, 255, 99, 1, 0, 255, 97, 0, 0, 255, 95, 0, 0, 255, 93, 0, 0, 255, 91, 0, 0, 255, 90, 0, 0, 255, 88, 0, 0, 255, 86, 0, 0, 255, 84, 0, 0, 255, 82, 0, 0, 255, 80, 0, 0, 255, 78, 0, 0, 255, 77, 0, 0, 255, 75, 0, 0, 255, 73, 0, 0, 255, 72, 0, 0, 255, 70, 0, 0, 255, 68, 0, 0, 255, 67, 0, 0, 255, 65, 0, 0, 255, 64, 0, 0, 255, 63, 0, 0, 255, 61, 0, 0, 255, 60, 0, 0, 255, 59, 0, 0, 255, 58, 0, 0, 255, 57, 0, 0, 255, 56, 0, 0, 255, 55, 0, 0, 255, 54, 0, 0, 255, 53, 0, 0, 255, 53, 0, 0, 255, 52, 0, 0, 255, 52, 0, 0, 255, 51, 0, 0, 255, 51, 0, 0, 255, 51, 0, 0, 255, 50, 0, 0, 255, 50, 0, 0, 255, 51, 0, 0, 255, 51, 0, 0, 255, 51, 0, 0, 255, 51, 0, 0, 255, 52, 0, 0, 255, 52, 0, 0, 255, 53, 0, 0, 255, 54, 1, 0, 255, 55, 2, 0, 255, 56, 3, 0, 255, 57, 4, 0, 255, 58, 5, 0, 255, 59, 6, 0, 255, 60, 7, 0, 255, 62, 8, 0, 255, 63, 9, 0, 255, 64, 11, 0, 255, 66, 12, 0, 255, 68, 13, 0, 255, 69, 14, 0, 255, 71, 16, 0, 255, 73, 17, 0, 255, 75, 18, 0, 255, 77, 20, 0, 255, 79, 21, 0, 255, 81, 23, 0, 255, 83, 24, 0, 255, 85, 26, 0, 255, 87, 28, 0, 255, 90, 29, 0, 255, 92, 31, 0, 255, 94, 33, 0, 255, 97, 34, 0, 255, 99, 36, 0, 255, 102, 38, 0, 255, 104, 40, 0, 255, 107, 41, 0, 255, 109, 43, 0, 255, 112, 45, 0, 255, 115, 47, 0, 255, 117, 49, 0, 255, 120, 51, 0, 255, 123, 52, 0, 255, 126, 54, 0, 255, 128, 56, 0, 255, 131, 58, 0, 255, 134, 60, 0, 255, 137, 62, 0, 255, 140, 64, 0, 255, 143, 66, 0, 255, 145, 68, 0, 255, 148, 70, 0, 255, 151, 72, 0, 255, 154, 74, 0, 255 ); type the_application = object(platform_support ) private m_method , m_comp_op : rbox_ctrl; m_radius : slider_ctrl; m_r , m_g , m_b : cbox_ctrl; m_shadow_ctrl : polygon_ctrl; m_path : path_storage; m_shape : conv_curve; m_ras : rasterizer_scanline_aa; m_sl : scanline_p8; m_shape_bounds : rect_d; m_gray8_buf : pod_array; m_gray8_rbuf , m_gray8_rbuf2 : rendering_buffer; m_color_lut : pod_array; public constructor Construct(format_ : pix_format_e; flip_y_ : boolean ); destructor Destruct; procedure on_resize(sx ,sy : int ); 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; var shape_mtx : trans_affine; tas : trans_affine_scaling; tat : trans_affine_translation; i : unsigned; p : int8u_ptr; rgba : aggclr; begin inherited Construct(format_ ,flip_y_ ); m_method.Construct (10.0 ,10.0 ,130.0 ,55.0 ,not flip_y_ ); m_comp_op.Construct(420 + 20.0 ,5.0 ,420 + 140.0 ,395.0 ,not flip_y_ ); m_radius.Construct (130 + 10.0 ,10.0 + 4.0 ,130 + 300.0 ,10.0 + 8.0 + 4.0 ,not flip_y_ ); m_r.Construct(10.0 ,95.0 - 30 ,'Red' ,not flip_y_ ); m_g.Construct(10.0 ,110.0 - 30 ,'Green' ,not flip_y_ ); m_b.Construct(10.0 ,125.0 - 30 ,'Blue' ,not flip_y_ ); m_shadow_ctrl.Construct(4 ); m_path.Construct; m_shape.Construct(@m_path ); m_ras.Construct; m_sl.Construct; m_shape_bounds.Construct; m_gray8_buf.Construct(sizeof(int8u ) ); m_gray8_rbuf.Construct; m_gray8_rbuf2.Construct; m_color_lut.Construct(sizeof(aggclr ) ); add_ctrl(@m_method ); m_method.text_size_(8 ); m_method.add_item ('Single Color' ); m_method.add_item ('Color LUT' ); m_method.cur_item_ (1 ); add_ctrl(@m_radius ); m_radius.range_(0.0 ,40.0 ); m_radius.value_(15.0 ); m_radius.label_('Blur Radius=%1.2f' ); add_ctrl(@m_r ); add_ctrl(@m_g ); add_ctrl(@m_b ); m_r.status_(true ); m_b.status_(true ); add_ctrl(@m_comp_op ); m_comp_op.text_size_(6.6 ); m_comp_op.add_item ('no compositions' ); m_comp_op.add_item ('clear' ); m_comp_op.add_item ('src' ); m_comp_op.add_item ('dst' ); m_comp_op.add_item ('src-over' ); m_comp_op.add_item ('dst-over' ); m_comp_op.add_item ('src-in' ); m_comp_op.add_item ('dst-in' ); m_comp_op.add_item ('src-out' ); m_comp_op.add_item ('dst-out' ); m_comp_op.add_item ('src-atop' ); m_comp_op.add_item ('dst-atop' ); m_comp_op.add_item ('xor' ); m_comp_op.add_item ('plus' ); m_comp_op.add_item ('minus' ); m_comp_op.add_item ('multiply' ); m_comp_op.add_item ('screen' ); m_comp_op.add_item ('overlay' ); m_comp_op.add_item ('darken' ); m_comp_op.add_item ('lighten' ); m_comp_op.add_item ('color-dodge' ); m_comp_op.add_item ('color-burn' ); m_comp_op.add_item ('hard-light' ); m_comp_op.add_item ('soft-light' ); m_comp_op.add_item ('difference' ); m_comp_op.add_item ('exclusion' ); m_comp_op.add_item ('contrast' ); m_comp_op.add_item ('invert' ); m_comp_op.add_item ('invert-rgb' ); m_comp_op.cur_item_ (0 ); add_ctrl(@m_shadow_ctrl ); m_shadow_ctrl.in_polygon_check_(true ); m_path.remove_all; m_path.move_to(28.47 ,6.45 ); m_path.curve3 (21.58 ,1.12 ,19.82 ,0.29 ); m_path.curve3 (17.19 ,-0.93 ,14.21 ,-0.93 ); m_path.curve3 (9.57 ,-0.93 ,6.57 ,2.25 ); m_path.curve3 (3.56 ,5.42 ,3.56 ,10.60 ); m_path.curve3 (3.56 ,13.87 ,5.03 ,16.26 ); m_path.curve3 (7.03 ,19.58 ,11.99 ,22.51 ); m_path.curve3 (16.94 ,25.44 ,28.47 ,29.64 ); m_path.line_to(28.47 ,31.40 ); m_path.curve3 (28.47 ,38.09 ,26.34 ,40.58 ); m_path.curve3 (24.22 ,43.07 ,20.17 ,43.07 ); m_path.curve3 (17.09 ,43.07 ,15.28 ,41.41 ); m_path.curve3 (13.43 ,39.75 ,13.43 ,37.60 ); m_path.line_to(13.53 ,34.77 ); m_path.curve3 (13.53 ,32.52 ,12.38 ,31.30 ); m_path.curve3 (11.23 ,30.08 ,9.38 ,30.08 ); m_path.curve3 (7.57 ,30.08 ,6.42 ,31.35 ); m_path.curve3 (5.27 ,32.62 ,5.27 ,34.81 ); m_path.curve3 (5.27 ,39.01 ,9.57 ,42.53 ); m_path.curve3 (13.87 ,46.04 ,21.63 ,46.04 ); m_path.curve3 (27.59 ,46.04 ,31.40 ,44.04 ); m_path.curve3 (34.28 ,42.53 ,35.64 ,39.31 ); m_path.curve3 (36.52 ,37.21 ,36.52 ,30.71 ); m_path.line_to(36.52 ,15.53 ); m_path.curve3 (36.52 ,9.13 ,36.77 ,7.69 ); m_path.curve3 (37.01 ,6.25 ,37.57 ,5.76 ); m_path.curve3 (38.13 ,5.27 ,38.87 ,5.27 ); m_path.curve3 (39.65 ,5.27 ,40.23 ,5.62 ); m_path.curve3 (41.26 ,6.25 ,44.19 ,9.18 ); m_path.line_to(44.19 ,6.45 ); m_path.curve3 (38.72 ,-0.88 ,33.74 ,-0.88 ); m_path.curve3 (31.35 ,-0.88 ,29.93 ,0.78 ); m_path.curve3 (28.52 ,2.44 ,28.47 ,6.45 ); m_path.close_polygon; m_path.move_to(28.47 ,9.62 ); m_path.line_to(28.47 ,26.66 ); m_path.curve3 (21.09 ,23.73 ,18.95, 22.51 ); m_path.curve3 (15.09 ,20.36 ,13.43, 18.02 ); m_path.curve3 (11.77 ,15.67 ,11.77, 12.89 ); m_path.curve3 (11.77 ,9.38 ,13.87, 7.06 ); m_path.curve3 (15.97 ,4.74 ,18.70, 4.74 ); m_path.curve3 (22.41 ,4.74 ,28.47, 9.62 ); m_path.close_polygon; shape_mtx.Construct; tas.Construct (4.0 ); shape_mtx.multiply(@tas ); tat.Construct (150 ,100 ); shape_mtx.multiply(@tat ); m_path.transform(@shape_mtx ); bounding_rect_single( @m_shape ,0 , @m_shape_bounds.x1 ,@m_shape_bounds.y1 , @m_shape_bounds.x2 ,@m_shape_bounds.y2 ); m_shadow_ctrl.xn_ptr(0 )^:=m_shape_bounds.x1; m_shadow_ctrl.yn_ptr(0 )^:=m_shape_bounds.y1; m_shadow_ctrl.xn_ptr(1 )^:=m_shape_bounds.x2; m_shadow_ctrl.yn_ptr(1 )^:=m_shape_bounds.y1; m_shadow_ctrl.xn_ptr(2 )^:=m_shape_bounds.x2; m_shadow_ctrl.yn_ptr(2 )^:=m_shape_bounds.y2; m_shadow_ctrl.xn_ptr(3 )^:=m_shape_bounds.x1; m_shadow_ctrl.yn_ptr(3 )^:=m_shape_bounds.y2; rgba.ConstrDbl (0 ,0.3 ,0.5 ,0.3 ); m_shadow_ctrl.line_color_(@rgba ); m_color_lut.resize(256 ); p:=@g_gradient_colors[0 ]; i:=0; while i < 256 do begin if i > 63 then aggclr_ptr(m_color_lut.array_operator(i ) ).ConstrInt( int8u_ptr(ptrcomp(p ) + 0 * sizeof(int8u ) )^ , int8u_ptr(ptrcomp(p ) + 1 * sizeof(int8u ) )^ , int8u_ptr(ptrcomp(p ) + 2 * sizeof(int8u ) )^ , 255 ) else aggclr_ptr(m_color_lut.array_operator(i ) ).ConstrInt( int8u_ptr(ptrcomp(p ) + 0 * sizeof(int8u ) )^ , int8u_ptr(ptrcomp(p ) + 1 * sizeof(int8u ) )^ , int8u_ptr(ptrcomp(p ) + 2 * sizeof(int8u ) )^ , i * 4 ); //aggclr_ptr(m_color_lut.array_operator(i ) ).premultiply; inc(ptrcomp(p ) ,4 * sizeof(int8u ) ); inc(i ); end; end; { DESTRUCT } destructor the_application.Destruct; begin inherited Destruct; m_method.Destruct; m_comp_op.Destruct; m_radius.Destruct; m_r.Destruct; m_g.Destruct; m_b.Destruct; m_shadow_ctrl.Destruct; m_path.Destruct; m_shape.Destruct; m_ras.Destruct; m_sl.Destruct; m_gray8_buf.Destruct; m_gray8_rbuf.Destruct; m_gray8_rbuf2.Destruct; m_color_lut.Destruct; end; { ON_RESIZE } procedure the_application.on_resize(sx ,sy : int ); begin m_gray8_buf.resize (sx * sy); m_gray8_rbuf.attach(m_gray8_buf.data ,sx ,sy ,sx ); end; { ON_DRAW } procedure the_application.on_draw; var rgba : aggclr; rens : renderer_scanline_aa_solid; pixf_gray8 ,pixf ,pixf2 ,pixf_blend : pixel_formats; renb_gray8 ,renb ,renb_blend : renderer_base; shadow_persp : trans_perspective; shadow_trans : conv_transform; bbox ,cl : rect_d; tm : double; buf : array[0..63 ] of char; t : gsv_text; st : conv_stroke; r ,g ,b : int; begin // Initialize structures m_ras.clip_box(0 ,0 ,_width ,_height ); pixfmt_gray8(pixf_gray8 ,@m_gray8_rbuf ); renb_gray8.Construct(@pixf_gray8 ); rgba.ConstrInt (0 ); renb_gray8.clear(@rgba ); // Testing enhanced compositing operations. // Uncomment and replace renb.blend_from_* to renb_blend.blend_from_* pixfmt_custom_blend_rgba(pixf_blend ,rbuf_window ,comp_op_adaptor_rgba ,bgra_order ); renb_blend.Construct (@pixf_blend ); if m_comp_op._cur_item > 0 then pixf_blend.comp_op_(m_comp_op._cur_item - 1 ); pixfmt(pixf ,rbuf_window ); renb.Construct(@pixf ); rens.Construct(@renb ); rgba.ConstrDbl(1 ,0.95 ,0.95 ); renb.clear (@rgba ); shadow_persp.Construct( m_shape_bounds.x1 ,m_shape_bounds.y1 , m_shape_bounds.x2 ,m_shape_bounds.y2 , pointer(m_shadow_ctrl._polygon ) ); shadow_trans.Construct(@m_shape ,@shadow_persp ); // Render the controls Before render_ctrl(@m_ras ,@m_sl ,@rens ,@m_method ); render_ctrl(@m_ras ,@m_sl ,@rens ,@m_radius ); render_ctrl(@m_ras ,@m_sl ,@rens ,@m_r ); render_ctrl(@m_ras ,@m_sl ,@rens ,@m_g ); render_ctrl(@m_ras ,@m_sl ,@rens ,@m_b ); render_ctrl(@m_ras ,@m_sl ,@rens ,@m_shadow_ctrl ); if m_r._status then r:=100 else r:=0; if m_g._status then g:=100 else g:=0; if m_b._status then b:=100 else b:=0; start_timer; // Render shadow m_ras.add_path(@shadow_trans ); rgba.ConstrInt (255 ); render_scanlines_aa_solid(@m_ras ,@m_sl ,@renb_gray8 ,@rgba ); // Calculate the bounding box and extend it by the blur radius bbox.Construct; bounding_rect_single(@shadow_trans ,0 ,@bbox.x1 ,@bbox.y1 ,@bbox.x2 ,@bbox.y2 ); bbox.x1:=bbox.x1 - m_radius._value; bbox.y1:=bbox.y1 - m_radius._value; bbox.x2:=bbox.x2 + m_radius._value; bbox.y2:=bbox.y2 + m_radius._value; cl.Construct(0 ,0 ,_width ,_height ); if bbox.clip(@cl ) then begin // Create a new pixel renderer and attach it to the main one as a child image. // It returns true if the attachment suceeded. It fails if the rectangle // (bbox) is fully clipped. pixfmt_gray8(pixf2 ,@m_gray8_rbuf2 ); if pixf2.attach(@pixf_gray8 ,Trunc(bbox.x1 ) ,Trunc(bbox.y1 ) ,Trunc(bbox.x2 ) ,Trunc(bbox.y2 ) ) then stack_blur_gray8(@pixf2 ,uround(m_radius._value ) ,uround(m_radius._value ) ); if m_method._cur_item = 0 then begin rgba.ConstrInt(r ,g ,b ); if m_comp_op._cur_item = 0 then renb.blend_from_color(@pixf2 ,@rgba ,NIL ,Trunc(bbox.x1 ) ,Trunc(bbox.y1 ) ) else renb_blend.blend_from_color(@pixf2 ,@rgba ,NIL ,Trunc(bbox.x1 ) ,Trunc(bbox.y1 ) ); end else if m_comp_op._cur_item = 0 then renb.blend_from_lut(@pixf2 ,m_color_lut.data ,NIL ,Trunc(bbox.x1 ) ,Trunc(bbox.y1 ) ) else renb_blend.blend_from_lut(@pixf2 ,m_color_lut.data ,NIL ,Trunc(bbox.x1 ) ,Trunc(bbox.y1 ) ); end; tm:=elapsed_time; // Info t.Construct; t.size_(10.0 ); st.Construct(@t ); st.width_ (1.5 ); sprintf(@buf[0 ] ,'%3.2f ms' ,tm ); t.start_point_(140.0 ,30.0 ); t.text_ (@buf[0 ] ); m_ras.add_path(@st ); rgba.ConstrDbl (0 ,0 , 0 ); render_scanlines_aa_solid(@m_ras ,@m_sl ,@renb ,@rgba ); // Render the controls After render_ctrl(@m_ras ,@m_sl ,@rens ,@m_comp_op ); // Free AGG resources t.Destruct; st.Destruct; end; { ON_MOUSE_MOVE } procedure the_application.on_mouse_move; begin if flags and mouse_left <> 0 then if m_shadow_ctrl.on_mouse_move(x ,y ,false ) then force_redraw; if flags and mouse_left = 0 then on_mouse_button_up(x ,y ,flags ); end; { ON_MOUSE_BUTTON_DOWN } procedure the_application.on_mouse_button_down; begin if flags and mouse_left <> 0 then if m_shadow_ctrl.on_mouse_button_down(x ,y ) then force_redraw; end; { ON_MOUSE_BUTTON_UP } procedure the_application.on_mouse_button_up; begin if m_shadow_ctrl.on_mouse_button_up(x ,y ) then force_redraw; end; { ON_KEY } procedure the_application.on_key; begin if key = key_f1 then message_( 'Now you can blur rendered images rather fast!'#13 + 'There two algorithms are used: Stack Blur by Mario Klingemann '#13 + 'and Fast Recursive Gaussian Filter. The speed of both methods'#13 + 'does not depend on the filter radius. Mario''s method works 3-5'#13 + 'times faster; it doesn''t produce exactly Gaussian response,'#13 + 'but pretty fair for most practical purposes. The recursive filter'#13 + 'uses floating point arithmetic and works slower. But it is true'#13 + 'Gaussian filter, with theoretically infinite impulse response.'#13 + 'The radius (actually 2*sigma value) can be fractional and the'#13 + 'filter produces quite adequate result.' ); end; VAR app : the_application; BEGIN app.Construct(pix_format ,flip_y ); app.caption_ ('AGG Example. Gaussian and Stack Blur (F1-Help)' ); if app.init(570 ,400 ,0 ) then app.run; app.Destruct; END.