mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 11:24:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			489 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			489 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
{mac_copy:1.bmp}
 | 
						||
{mac_copy:2.bmp}
 | 
						||
{mac_copy:3.bmp}
 | 
						||
{mac_copy:4.bmp}
 | 
						||
{mac_copy:5.bmp}
 | 
						||
{mac_copy:6.bmp}
 | 
						||
{mac_copy:7.bmp}
 | 
						||
{mac_copy:8.bmp}
 | 
						||
{mac_copy:9.bmp}
 | 
						||
//
 | 
						||
// 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
 | 
						||
 line_patterns ;
 | 
						||
 | 
						||
uses
 | 
						||
 SysUtils ,
 | 
						||
 | 
						||
 agg_basics ,
 | 
						||
 agg_platform_support ,
 | 
						||
 | 
						||
 agg_color ,
 | 
						||
 agg_pixfmt ,
 | 
						||
 agg_pixfmt_rgb ,
 | 
						||
 | 
						||
 agg_ctrl ,
 | 
						||
 agg_slider_ctrl ,
 | 
						||
 agg_bezier_ctrl ,
 | 
						||
 | 
						||
 agg_rendering_buffer ,
 | 
						||
 agg_renderer_base ,
 | 
						||
 agg_renderer_scanline ,
 | 
						||
 agg_renderer_outline_aa ,
 | 
						||
 agg_renderer_outline_image ,
 | 
						||
 agg_rasterizer_scanline_aa ,
 | 
						||
 agg_rasterizer_outline_aa ,
 | 
						||
 agg_scanline ,
 | 
						||
 agg_scanline_p ,
 | 
						||
 agg_render_scanlines ,
 | 
						||
 | 
						||
 agg_pattern_filters_rgba ,
 | 
						||
 agg_conv_stroke ,
 | 
						||
 agg_conv_transform ,
 | 
						||
 agg_conv_clip_polyline ,
 | 
						||
 agg_vertex_source ;
 | 
						||
 | 
						||
{$I agg_mode.inc }
 | 
						||
{$I- }
 | 
						||
const
 | 
						||
 flip_y = true;
 | 
						||
 | 
						||
 brightness_to_alpha : array[0..256 * 3 - 1 ] of int8u = (
 | 
						||
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
 | 
						||
  254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 253, 253,
 | 
						||
  253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 252,
 | 
						||
  252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 251, 251, 251, 251, 251,
 | 
						||
  251, 251, 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, 249, 249, 249, 249,
 | 
						||
  249, 249, 249, 248, 248, 248, 248, 248, 248, 248, 247, 247, 247, 247, 247, 246,
 | 
						||
  246, 246, 246, 246, 246, 245, 245, 245, 245, 245, 244, 244, 244, 244, 243, 243,
 | 
						||
  243, 243, 243, 242, 242, 242, 242, 241, 241, 241, 241, 240, 240, 240, 239, 239,
 | 
						||
  239, 239, 238, 238, 238, 238, 237, 237, 237, 236, 236, 236, 235, 235, 235, 234,
 | 
						||
  234, 234, 233, 233, 233, 232, 232, 232, 231, 231, 230, 230, 230, 229, 229, 229,
 | 
						||
  228, 228, 227, 227, 227, 226, 226, 225, 225, 224, 224, 224, 223, 223, 222, 222,
 | 
						||
  221, 221, 220, 220, 219, 219, 219, 218, 218, 217, 217, 216, 216, 215, 214, 214,
 | 
						||
  213, 213, 212, 212, 211, 211, 210, 210, 209, 209, 208, 207, 207, 206, 206, 205,
 | 
						||
  204, 204, 203, 203, 202, 201, 201, 200, 200, 199, 198, 198, 197, 196, 196, 195,
 | 
						||
  194, 194, 193, 192, 192, 191, 190, 190, 189, 188, 188, 187, 186, 186, 185, 184,
 | 
						||
  183, 183, 182, 181, 180, 180, 179, 178, 177, 177, 176, 175, 174, 174, 173, 172,
 | 
						||
  171, 171, 170, 169, 168, 167, 166, 166, 165, 164, 163, 162, 162, 161, 160, 159,
 | 
						||
  158, 157, 156, 156, 155, 154, 153, 152, 151, 150, 149, 148, 148, 147, 146, 145,
 | 
						||
  144, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129,
 | 
						||
  128, 128, 127, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113,
 | 
						||
  112, 111, 110, 109, 108, 107, 106, 105, 104, 102, 101, 100,  99,  98,  97,  96,
 | 
						||
   95,  94,  93,  91,  90,  89,  88,  87,  86,  85,  84,  82,  81,  80,  79,  78,
 | 
						||
   77,  75,  74,  73,  72,  71,  70,  69,  67,  66,  65,  64,  63,  61,  60,  59,
 | 
						||
   58,  57,  56,  54,  53,  52,  51,  50,  48,  47,  46,  45,  44,  42,  41,  40,
 | 
						||
   39,  37,  36,  35,  34,  33,  31,  30,  29,  28,  27,  25,  24,  23,  22,  20,
 | 
						||
   19,  18,  17,  15,  14,  13,  12,  11,   9,   8,   7,   6,   4,   3,   2,   1 );
 | 
						||
 | 
						||
type
 | 
						||
 pattern_src_brightness_to_alpha_rgba8 = object(pixel_source )
 | 
						||
   m_rb : rendering_buffer_ptr;
 | 
						||
   m_pf : pixel_formats;
 | 
						||
 | 
						||
   constructor Construct(rb : rendering_buffer_ptr );
 | 
						||
 | 
						||
   function  _width : unsigned; virtual;
 | 
						||
   function  _height : unsigned; virtual;
 | 
						||
 | 
						||
   function  pixel(x ,y : int ) : rgba8; virtual;
 | 
						||
 | 
						||
  end;
 | 
						||
 | 
						||
 the_application = object(platform_support )
 | 
						||
   m_ctrl_color : aggclr;
 | 
						||
 | 
						||
   m_curve1  ,
 | 
						||
   m_curve2  ,
 | 
						||
   m_curve3  ,
 | 
						||
   m_curve4  ,
 | 
						||
   m_curve5  ,
 | 
						||
   m_curve6  ,
 | 
						||
   m_curve7  ,
 | 
						||
   m_curve8  ,
 | 
						||
   m_curve9  : bezier_ctrl;
 | 
						||
   m_scale_x ,
 | 
						||
   m_start_x : slider_ctrl;
 | 
						||
 | 
						||
   constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
 | 
						||
   destructor  Destruct;
 | 
						||
 | 
						||
   procedure draw_curve(
 | 
						||
              patt : line_image_pattern_ptr;
 | 
						||
              ras  : rasterizer_outline_aa_ptr;
 | 
						||
              ren  : renderer_outline_image_ptr;
 | 
						||
              src  : pixel_source_ptr;
 | 
						||
              vs   : vertex_source_ptr );
 | 
						||
 | 
						||
   procedure on_draw; virtual;
 | 
						||
 | 
						||
   procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
 | 
						||
   procedure on_ctrl_change; virtual;
 | 
						||
 | 
						||
  end;
 | 
						||
 | 
						||
{ CONSTRUCT }
 | 
						||
constructor pattern_src_brightness_to_alpha_rgba8.Construct;
 | 
						||
begin
 | 
						||
 m_rb:=rb;
 | 
						||
 | 
						||
 pixfmt_bgr24(m_pf ,m_rb );
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ _WIDTH }
 | 
						||
function pattern_src_brightness_to_alpha_rgba8._width;
 | 
						||
begin
 | 
						||
 result:=m_pf._width;
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ _HEIGHT }
 | 
						||
function pattern_src_brightness_to_alpha_rgba8._height;
 | 
						||
begin
 | 
						||
 result:=m_pf._height;
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ PIXEL }
 | 
						||
function pattern_src_brightness_to_alpha_rgba8.pixel;
 | 
						||
var
 | 
						||
 c : aggclr;
 | 
						||
 | 
						||
begin
 | 
						||
 c  :=m_pf.pixel(@m_pf ,x ,y );
 | 
						||
 c.a:=brightness_to_alpha[c.r + c.g + c.b ];
 | 
						||
 | 
						||
 result.r:=c.r;
 | 
						||
 result.g:=c.g;
 | 
						||
 result.b:=c.b;
 | 
						||
 result.a:=c.a;
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ CONSTRUCT }
 | 
						||
constructor the_application.Construct;
 | 
						||
begin
 | 
						||
 inherited Construct(format_ ,flip_y_ );
 | 
						||
 | 
						||
 m_ctrl_color.ConstrDbl(0 ,0.3 ,0.5 ,0.3 );
 | 
						||
 | 
						||
 m_scale_x.Construct(5.0 ,5.0 ,240.0 ,12.0 ,not flip_y_ );
 | 
						||
 m_start_x.Construct(250.0 ,5.0 ,495.0 ,12.0 ,not flip_y_ );
 | 
						||
 | 
						||
 m_curve1.Construct;
 | 
						||
 m_curve2.Construct;
 | 
						||
 m_curve3.Construct;
 | 
						||
 m_curve4.Construct;
 | 
						||
 m_curve5.Construct;
 | 
						||
 m_curve6.Construct;
 | 
						||
 m_curve7.Construct;
 | 
						||
 m_curve8.Construct;
 | 
						||
 m_curve9.Construct;
 | 
						||
 | 
						||
 m_curve1.line_color_(@m_ctrl_color );
 | 
						||
 m_curve2.line_color_(@m_ctrl_color );
 | 
						||
 m_curve3.line_color_(@m_ctrl_color );
 | 
						||
 m_curve4.line_color_(@m_ctrl_color );
 | 
						||
 m_curve5.line_color_(@m_ctrl_color );
 | 
						||
 m_curve6.line_color_(@m_ctrl_color );
 | 
						||
 m_curve7.line_color_(@m_ctrl_color );
 | 
						||
 m_curve8.line_color_(@m_ctrl_color );
 | 
						||
 m_curve9.line_color_(@m_ctrl_color );
 | 
						||
 | 
						||
 m_curve1.curve_(64  ,19  ,14  ,126 ,118 ,266 ,19  ,265 );
 | 
						||
 m_curve2.curve_(112 ,113 ,178 ,32  ,200 ,132 ,125 ,438 );
 | 
						||
 m_curve3.curve_(401 ,24  ,326 ,149 ,285 ,11  ,177 ,77 );
 | 
						||
 m_curve4.curve_(188 ,427 ,129 ,295 ,19  ,283 ,25  ,410 );
 | 
						||
 m_curve5.curve_(451 ,346 ,302 ,218 ,265 ,441 ,459 ,400 );
 | 
						||
 m_curve6.curve_(454 ,198 ,14  ,13  ,220 ,291 ,483 ,283 );
 | 
						||
 m_curve7.curve_(301 ,398 ,355 ,231 ,209 ,211 ,170 ,353 );
 | 
						||
 m_curve8.curve_(484 ,101 ,222 ,33  ,486 ,435 ,487 ,138 );
 | 
						||
 m_curve9.curve_(143 ,147 ,11  ,45  ,83  ,427 ,132 ,197 );
 | 
						||
 | 
						||
 add_ctrl(@m_curve1 );
 | 
						||
 add_ctrl(@m_curve2 );
 | 
						||
 add_ctrl(@m_curve3 );
 | 
						||
 add_ctrl(@m_curve4 );
 | 
						||
 add_ctrl(@m_curve5 );
 | 
						||
 add_ctrl(@m_curve6 );
 | 
						||
 add_ctrl(@m_curve7 );
 | 
						||
 add_ctrl(@m_curve8 );
 | 
						||
 add_ctrl(@m_curve9 );
 | 
						||
 | 
						||
 m_curve1.no_transform;
 | 
						||
 m_curve2.no_transform;
 | 
						||
 m_curve3.no_transform;
 | 
						||
 m_curve4.no_transform;
 | 
						||
 m_curve5.no_transform;
 | 
						||
 m_curve6.no_transform;
 | 
						||
 m_curve7.no_transform;
 | 
						||
 m_curve8.no_transform;
 | 
						||
 m_curve9.no_transform;
 | 
						||
 | 
						||
 m_scale_x.label_('Scale X=%.2f' );
 | 
						||
 m_scale_x.range_(0.2 ,3.0 );
 | 
						||
 m_scale_x.value_(1.0 );
 | 
						||
 m_scale_x.no_transform;
 | 
						||
 | 
						||
 add_ctrl(@m_scale_x );
 | 
						||
 | 
						||
 m_start_x.label_('Start X=%.2f' );
 | 
						||
 m_start_x.range_(0.0 ,10.0 );
 | 
						||
 m_start_x.value_(0.0 );
 | 
						||
 m_start_x.no_transform;
 | 
						||
 | 
						||
 add_ctrl(@m_start_x );
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ DESTRUCT }
 | 
						||
destructor the_application.Destruct;
 | 
						||
begin
 | 
						||
 inherited Destruct;
 | 
						||
 | 
						||
 m_scale_x.Destruct;
 | 
						||
 m_start_x.Destruct;
 | 
						||
 | 
						||
 m_curve1.Destruct;
 | 
						||
 m_curve2.Destruct;
 | 
						||
 m_curve3.Destruct;
 | 
						||
 m_curve4.Destruct;
 | 
						||
 m_curve5.Destruct;
 | 
						||
 m_curve6.Destruct;
 | 
						||
 m_curve7.Destruct;
 | 
						||
 m_curve8.Destruct;
 | 
						||
 m_curve9.Destruct;
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ DRAW_CURVE }
 | 
						||
procedure the_application.draw_curve;
 | 
						||
begin
 | 
						||
 patt.create (src );
 | 
						||
 ren.scale_x_(m_scale_x._value );
 | 
						||
 ren.start_x_(m_start_x._value );
 | 
						||
 ras.add_path(vs );
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ ON_DRAW }
 | 
						||
procedure the_application.on_draw;
 | 
						||
var
 | 
						||
 pf  : pixel_formats;
 | 
						||
 ren : renderer_scanline_aa_solid;
 | 
						||
 ras : rasterizer_scanline_aa;
 | 
						||
 sl  : scanline_p8;
 | 
						||
 | 
						||
 rgba : aggclr;
 | 
						||
 | 
						||
 ren_base : renderer_base;
 | 
						||
 | 
						||
 p1 ,p2 ,p3 ,p4 ,p5 ,p6 ,p7 ,p8 ,p9 : pattern_src_brightness_to_alpha_rgba8;
 | 
						||
 | 
						||
 fltr : pattern_filter_bilinear_rgba{};
 | 
						||
 patt : line_image_pattern;
 | 
						||
 | 
						||
 ren_img : renderer_outline_image;
 | 
						||
 ras_img : rasterizer_outline_aa;
 | 
						||
 | 
						||
begin
 | 
						||
// Initialize structures
 | 
						||
 pixfmt_bgr24(pf ,rbuf_window );
 | 
						||
 | 
						||
 ren_base.Construct(@pf );
 | 
						||
 ren.Construct     (@ren_base );
 | 
						||
 | 
						||
 rgba.ConstrDbl(1.0 ,1.0 ,0.95 );
 | 
						||
 ren_base.clear(@rgba );
 | 
						||
 | 
						||
 ras.Construct;
 | 
						||
 sl.Construct;
 | 
						||
 | 
						||
// Pattern source. Must have an interface:
 | 
						||
// width() const
 | 
						||
// height() const
 | 
						||
// pixel(int x, int y) const
 | 
						||
// Any agg::renderer_base<> or derived
 | 
						||
// is good for the use as a source.
 | 
						||
 p1.Construct(rbuf_img(0 ) );
 | 
						||
 p2.Construct(rbuf_img(1 ) );
 | 
						||
 p3.Construct(rbuf_img(2 ) );
 | 
						||
 p4.Construct(rbuf_img(3 ) );
 | 
						||
 p5.Construct(rbuf_img(4 ) );
 | 
						||
 p6.Construct(rbuf_img(5 ) );
 | 
						||
 p7.Construct(rbuf_img(6 ) );
 | 
						||
 p8.Construct(rbuf_img(7 ) );
 | 
						||
 p9.Construct(rbuf_img(8 ) );
 | 
						||
 | 
						||
 fltr.Construct; // Filtering functor
 | 
						||
 | 
						||
// agg::line_image_pattern is the main container for the patterns. It creates
 | 
						||
// a copy of the patterns extended according to the needs of the filter.
 | 
						||
// agg::line_image_pattern can operate with arbitrary image width, but if the 
 | 
						||
// width of the pattern is power of 2, it's better to use the modified
 | 
						||
// version agg::line_image_pattern_pow2 because it works about 15-25 percent
 | 
						||
// faster than agg::line_image_pattern (because of using simple masking instead
 | 
						||
// of expensive '%' operation).
 | 
						||
 | 
						||
//-- Create with specifying the source
 | 
						||
// patt.Construct(@fltr ,@src );
 | 
						||
 | 
						||
//-- Create uninitialized and set the source
 | 
						||
 patt.Construct   (@fltr );
 | 
						||
 ren_img.Construct(@ren_base ,@patt );
 | 
						||
 ras_img.Construct(@ren_img );
 | 
						||
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p1 ,m_curve1._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p2 ,m_curve2._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p3 ,m_curve3._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p4 ,m_curve4._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p5 ,m_curve5._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p6 ,m_curve6._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p7 ,m_curve7._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p8 ,m_curve8._curve );
 | 
						||
 draw_curve(@patt ,@ras_img ,@ren_img ,@p9 ,m_curve9._curve );
 | 
						||
 | 
						||
// Render the controls
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve1 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve2 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve3 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve4 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve5 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve6 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve7 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve8 );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_curve9 );
 | 
						||
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_scale_x );
 | 
						||
 render_ctrl(@ras ,@sl ,@ren ,@m_start_x );
 | 
						||
 | 
						||
// Free AGG resources
 | 
						||
 ras.Destruct;
 | 
						||
 sl.Destruct;
 | 
						||
 | 
						||
 patt.Destruct;
 | 
						||
 ras_img.Destruct;
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ ON_KEY }
 | 
						||
procedure the_application.on_key;
 | 
						||
var
 | 
						||
 fd  : text;
 | 
						||
 buf : array[0..255 ] of char;
 | 
						||
 | 
						||
begin
 | 
						||
 if key = byte(' ' ) then
 | 
						||
  begin
 | 
						||
   AssignFile(fd ,'coord' );
 | 
						||
   rewrite   (fd );
 | 
						||
 | 
						||
   sprintf(@buf[0 ]             ,'%.0f, ' ,m_curve1._x1 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._y1 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._x2 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._y2 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._x3 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._y3 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f, ' ,m_curve1._x4 );
 | 
						||
   sprintf(@buf[StrLen(@buf ) ] ,'%.0f'   ,m_curve1._y4 );
 | 
						||
 | 
						||
   write(fd ,PChar(@buf[0 ] ) );
 | 
						||
   close(fd );
 | 
						||
 | 
						||
  end;
 | 
						||
 | 
						||
 if key = key_f1 then
 | 
						||
  message_(
 | 
						||
   'The demo shows a very powerful mechanism of using arbitrary images as line patterns. '#13 +
 | 
						||
   'The main point of it is that the images are drawn along the path. It allows you to '#13 +
 | 
						||
   'draw very fancy looking lines quite easily and very useful in GIS/cartography applications. '#13 +
 | 
						||
   'There the bilinear filtering is used, but it''s also possible to add any other filtering '#13 +
 | 
						||
   'methods, or just use the nearest neighbour one for the sake of speed. '#13 +
 | 
						||
   'Actually, the algorithm uses 32bit images with alpha channel, but in this demo alpha is '#13 +
 | 
						||
   'simulated in such a way that wite is transparent, black is opaque. The intermediate colors '#13 +
 | 
						||
   'have intermediate opacity that is defined by the brightness_to_alpha array.'#13#13 +
 | 
						||
   'How to play with:'#13#13 +
 | 
						||
   'In the demo you can drag the control points of the curves and observe that the images '#13 +
 | 
						||
   'are transformed quite consistently and smoothly. You can also try to replace the image '#13 +
 | 
						||
   'files (1<>9) with your own. The BMP files must have 24bit colors (TrueColor), the PPM '#13 +
 | 
						||
   'ones must be of type "P6". Also, the heigh should not exceed 64 pixels, and the background '#13 +
 | 
						||
   'should be white or very close to white.'#13 +
 | 
						||
   'Press the spacebar to write down the "coord" file of the curve 1 (of 1.bmp).' +
 | 
						||
   #13#13'Note: F2 key saves current "screenshot" file in this demo''s directory.  ' );
 | 
						||
 | 
						||
end;
 | 
						||
 | 
						||
{ ON_CTRL_CHANGE }
 | 
						||
procedure the_application.on_ctrl_change;
 | 
						||
begin
 | 
						||
end;
 | 
						||
 | 
						||
VAR
 | 
						||
 app : the_application;
 | 
						||
 buf : array [0..255 ] of char;
 | 
						||
 ext : string[10 ];
 | 
						||
 | 
						||
BEGIN
 | 
						||
 app.Construct(pix_format_bgr24 ,flip_y );
 | 
						||
 app.caption_ ('AGG Example. Drawing Lines with Image Patterns (F1-Help)' );
 | 
						||
 | 
						||
 if not app.load_img(0 ,'1' ) or
 | 
						||
    not app.load_img(1 ,'2' ) or
 | 
						||
    not app.load_img(2 ,'3' ) or
 | 
						||
    not app.load_img(3 ,'4' ) or
 | 
						||
    not app.load_img(4 ,'5' ) or
 | 
						||
    not app.load_img(5 ,'6' ) or
 | 
						||
    not app.load_img(6 ,'7' ) or
 | 
						||
    not app.load_img(7 ,'8' ) or
 | 
						||
    not app.load_img(8 ,'9' ) then
 | 
						||
  begin
 | 
						||
   ext:=app._img_ext;
 | 
						||
 | 
						||
   sprintf(@buf[0 ] ,'There must be files 1%s' ,ptrcomp(@ext[1 ] ) );
 | 
						||
   sprintf(
 | 
						||
    @buf[StrLen(@buf ) ] ,
 | 
						||
    '...9%s'#13 +
 | 
						||
    'Download and unzip:'#13 +
 | 
						||
    'http://www.antigrain.com/line_patterns.bmp.zip'#13 +
 | 
						||
    'or'#13 +
 | 
						||
    'http://www.antigrain.com/line_patterns.ppm.tar.gz'#13 ,
 | 
						||
    ptrcomp(@ext[1 ] ) );
 | 
						||
 | 
						||
   app.message_(@buf[0 ] );
 | 
						||
 | 
						||
  end
 | 
						||
 else
 | 
						||
  if app.init(500 ,450 ,window_resize ) then
 | 
						||
   app.run;
 | 
						||
 | 
						||
 app.Destruct;
 | 
						||
 | 
						||
END. |