mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 05:39:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			257 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
//
 | 
						|
// 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
 | 
						|
 raster_text ;
 | 
						|
 | 
						|
uses
 | 
						|
 agg_basics ,
 | 
						|
 agg_platform_support ,
 | 
						|
 | 
						|
 agg_color ,
 | 
						|
 agg_pixfmt ,
 | 
						|
 agg_pixfmt_rgb ,
 | 
						|
 | 
						|
 agg_rendering_buffer ,
 | 
						|
 agg_renderer_base ,
 | 
						|
 agg_renderer_scanline ,
 | 
						|
 agg_rasterizer_scanline_aa ,
 | 
						|
 agg_scanline_u ,
 | 
						|
 agg_render_scanlines ,
 | 
						|
 | 
						|
 agg_span_allocator ,
 | 
						|
 agg_span_gradient ,
 | 
						|
 agg_span_interpolator_linear ,
 | 
						|
 agg_embedded_raster_fonts ,
 | 
						|
 agg_glyph_raster_bin ,
 | 
						|
 agg_renderer_raster_text ,
 | 
						|
 agg_trans_affine ;
 | 
						|
 | 
						|
{$I agg_mode.inc }
 | 
						|
 | 
						|
const
 | 
						|
 flip_y = true;
 | 
						|
 | 
						|
type
 | 
						|
 gradient_sine_repeat_adaptor = object(gradient )
 | 
						|
   m_gradient : gradient_ptr;
 | 
						|
   m_periods  : double;
 | 
						|
 | 
						|
   constructor Construct(GF : gradient_ptr );
 | 
						|
 | 
						|
   procedure _periods(p : double );
 | 
						|
 | 
						|
   function  calculate(x ,y ,d : int ) : int; virtual;
 | 
						|
 | 
						|
  end;
 | 
						|
 | 
						|
 the_application = object(platform_support )
 | 
						|
   constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
 | 
						|
   destructor  Destruct;
 | 
						|
 | 
						|
   procedure on_draw; virtual;
 | 
						|
 | 
						|
   procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
 | 
						|
 | 
						|
  end;
 | 
						|
 | 
						|
{ CONSTRUCT }
 | 
						|
constructor gradient_sine_repeat_adaptor.Construct;
 | 
						|
begin
 | 
						|
 m_gradient:=GF;
 | 
						|
 m_periods :=pi* 2.0;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ _PERIODS }
 | 
						|
procedure gradient_sine_repeat_adaptor._periods;
 | 
						|
begin
 | 
						|
 m_periods:=p * pi * 2.0;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ CALCULATE }
 | 
						|
function gradient_sine_repeat_adaptor.calculate;
 | 
						|
begin
 | 
						|
 result:=trunc((1.0 + Sin(m_gradient.calculate(x ,y ,d ) * m_periods / d ) ) * d / 2 );
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ CONSTRUCT }
 | 
						|
constructor the_application.Construct;
 | 
						|
begin
 | 
						|
 inherited Construct(format_ ,flip_y_ );
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ DESTRUCT }
 | 
						|
destructor the_application.Destruct;
 | 
						|
begin
 | 
						|
 inherited Destruct;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ ON_DRAW }
 | 
						|
procedure the_application.on_draw;
 | 
						|
type
 | 
						|
 font_type = record
 | 
						|
   font : int8u_ptr;
 | 
						|
   name : PChar;
 | 
						|
 | 
						|
  end;
 | 
						|
 | 
						|
const
 | 
						|
 fonts : array[0..34 ] of font_type = (
 | 
						|
  (font:@gse4x6;               name:'gse4x6'               ) ,
 | 
						|
  (font:@gse4x8;               name:'gse4x8'               ) ,
 | 
						|
  (font:@gse5x7;               name:'gse5x7'               ) ,
 | 
						|
  (font:@gse5x9;               name:'gse5x9'              ) ,
 | 
						|
  (font:@gse6x9;               name:'gse6x9'               ) ,
 | 
						|
  (font:@gse6x12;              name:'gse6x12'              ) ,
 | 
						|
  (font:@gse7x11;              name:'gse7x11'              ) ,
 | 
						|
  (font:@gse7x11_bold;         name:'gse7x11_bold'         ) ,
 | 
						|
  (font:@gse7x15;              name:'gse7x15'              ) ,
 | 
						|
  (font:@gse7x15_bold;         name:'gse7x15_bold'         ) ,
 | 
						|
  (font:@gse8x16;              name:'gse8x16'              ) ,
 | 
						|
  (font:@gse8x16_bold;         name:'gse8x16_bold'         ) ,
 | 
						|
  (font:@mcs11_prop;           name:'mcs11_prop'           ) ,
 | 
						|
  (font:@mcs11_prop_condensed; name:'mcs11_prop_condensed' ) ,
 | 
						|
  (font:@mcs12_prop;           name:'mcs12_prop'           ) ,
 | 
						|
  (font:@mcs13_prop;           name:'mcs13_prop'           ) ,
 | 
						|
  (font:@mcs5x10_mono;         name:'mcs5x10_mono'         ) ,
 | 
						|
  (font:@mcs5x11_mono;         name:'mcs5x11_mono'         ) ,
 | 
						|
  (font:@mcs6x10_mono;         name:'mcs6x10_mono'         ) ,
 | 
						|
  (font:@mcs6x11_mono;         name:'mcs6x11_mono'         ) ,
 | 
						|
  (font:@mcs7x12_mono_high;    name:'mcs7x12_mono_high'    ) ,
 | 
						|
  (font:@mcs7x12_mono_low;     name:'mcs7x12_mono_low'     ) ,
 | 
						|
  (font:@verdana12;            name:'verdana12'            ) ,
 | 
						|
  (font:@verdana12_bold;       name:'verdana12_bold'       ) ,
 | 
						|
  (font:@verdana13;            name:'verdana13'            ) ,
 | 
						|
  (font:@verdana13_bold;       name:'verdana13_bold'       ) ,
 | 
						|
  (font:@verdana14;            name:'verdana14'            ) ,
 | 
						|
  (font:@verdana14_bold;       name:'verdana14_bold'       ) ,
 | 
						|
  (font:@verdana16;            name:'verdana16'            ) ,
 | 
						|
  (font:@verdana16_bold;       name:'verdana16_bold'       ) ,
 | 
						|
  (font:@verdana17;            name:'verdana17'            ) ,
 | 
						|
  (font:@verdana17_bold;       name:'verdana17_bold'       ) ,
 | 
						|
  (font:@verdana18;            name:'verdana18'            ) ,
 | 
						|
  (font:@verdana18_bold;       name:'verdana18_bold'       ) ,
 | 
						|
  (font:NIL;                   name:NIL ) );
 | 
						|
 | 
						|
var
 | 
						|
 pixf : pixel_formats;
 | 
						|
 rgba ,
 | 
						|
 rgbb : aggclr;
 | 
						|
 | 
						|
 rb : renderer_base;
 | 
						|
 rt : renderer_raster_htext_solid;
 | 
						|
 | 
						|
 glyph : glyph_raster_bin;
 | 
						|
 | 
						|
 i : int;
 | 
						|
 y : double;
 | 
						|
 | 
						|
 buf : string[100 ];
 | 
						|
 mtx : trans_affine;
 | 
						|
 | 
						|
 grad_circ  : gradient_circle;
 | 
						|
 grad_func  : gradient_sine_repeat_adaptor;
 | 
						|
 color_func : gradient_linear_color;
 | 
						|
 | 
						|
 inter : span_interpolator_linear;
 | 
						|
 | 
						|
 sa  : span_allocator;
 | 
						|
 sg  : span_gradient;
 | 
						|
 ren : renderer_scanline_aa;
 | 
						|
 rt2 : renderer_raster_htext;
 | 
						|
 | 
						|
begin
 | 
						|
// Initialize structures
 | 
						|
 glyph.Construct(NIL );
 | 
						|
 | 
						|
 pixfmt_bgr24(pixf ,rbuf_window );
 | 
						|
 rb.Construct(@pixf );
 | 
						|
 | 
						|
 rgba.ConstrDbl(1 ,1 ,1 );
 | 
						|
 rb.clear      (@rgba );
 | 
						|
 | 
						|
 rt.Construct(@rb ,@glyph );
 | 
						|
 | 
						|
 y:=5;
 | 
						|
 | 
						|
 rgba.ConstrDbl(0 ,0 ,0 );
 | 
						|
 rt.color_     (@rgba );
 | 
						|
 | 
						|
// Render all raster fonts
 | 
						|
 i:=0;
 | 
						|
 | 
						|
 while fonts[i ].font <> NIL do
 | 
						|
  begin
 | 
						|
   buf:='A quick brown fox jumps over the lazy dog 0123456789: ' + fonts[i ].name + #0;
 | 
						|
 | 
						|
   glyph.font_   (fonts[i ].font );
 | 
						|
   rt.render_text(5 ,y ,@buf[1 ] ,not flip_y );
 | 
						|
 | 
						|
   y:=y + glyph.height + 1;
 | 
						|
 | 
						|
   inc(i );
 | 
						|
 | 
						|
  end;
 | 
						|
 | 
						|
// Render gradient font
 | 
						|
 grad_circ.Construct;
 | 
						|
 grad_func.Construct(@grad_circ );
 | 
						|
 grad_func._periods (5 );
 | 
						|
 | 
						|
 rgba.ConstrDbl      (1.0 ,0 ,0 );
 | 
						|
 rgbb.ConstrDbl      (0 ,0.5 ,0 );
 | 
						|
 color_func.Construct(@rgba ,@rgbb );
 | 
						|
 | 
						|
 mtx.Construct;
 | 
						|
 inter.Construct(@mtx );
 | 
						|
 | 
						|
 sa.Construct;
 | 
						|
 sg.Construct (@sa ,@inter ,@grad_func ,@color_func ,0 ,150.0 );
 | 
						|
 ren.Construct(@rb ,@sg );
 | 
						|
 rt2.Construct(@ren ,@glyph );
 | 
						|
 | 
						|
 rt2.render_text(5 ,465 ,'RADIAL REPEATING GRADIENT: A quick brown fox jumps over the lazy dog' ,not flip_y );
 | 
						|
 | 
						|
// Free AGG resources
 | 
						|
 sa.Destruct;
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
{ ON_KEY }
 | 
						|
procedure the_application.on_key;
 | 
						|
begin
 | 
						|
 if key = key_f1 then
 | 
						|
  message_(
 | 
						|
   'Classes that render raster text was added in AGG mostly to prove the concept of   '#13 +
 | 
						|
   'the design. They can be used to draw simple (aliased) raster text. The example '#13 +
 | 
						|
   'demonstrates how to use text as a custom scanline generator together with any '#13 +
 | 
						|
   'span generator (in this example it''s gradient filling). The font format is '#13 +
 | 
						|
   'propriatory, but there are some predefined fonts that are shown in the example.'#13#13 +
 | 
						|
   'How to play with:'#13#13 +
 | 
						|
   'Change the renderer "rt" to "renderer_raster_vtext_solid" in the source code'#13 +
 | 
						|
   'and recompile it, to get the vertical raster font orientation.' +
 | 
						|
   #13#13'Note: F2 key saves current "screenshot" file in this demo''s directory.  ' );
 | 
						|
 | 
						|
end;
 | 
						|
 | 
						|
VAR
 | 
						|
 app : the_application;
 | 
						|
 | 
						|
BEGIN
 | 
						|
 app.Construct(pix_format_bgr24 ,flip_y );
 | 
						|
 app.caption_ ('AGG Example. Raster Text (F1-Help)' );
 | 
						|
 | 
						|
 if app.init(640 ,480 ,window_resize ) then
 | 
						|
  app.run;
 | 
						|
 | 
						|
 app.Destruct;
 | 
						|
 | 
						|
END. |