mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-26 08:48:18 +02:00
271 lines
5.3 KiB
ObjectPascal
271 lines
5.3 KiB
ObjectPascal
//----------------------------------------------------------------------------
|
|
// Anti-Grain Geometry - Version 2.4 (Public License)
|
|
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
|
|
//
|
|
// Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
|
|
// Pascal Port By: Milan Marusinec alias Milano
|
|
// milan@marusinec.sk
|
|
// http://www.aggpas.org
|
|
// Copyright (c) 2005-2006
|
|
//
|
|
// Permission to copy, use, modify, sell and distribute this software
|
|
// is granted provided this copyright notice appears in all copies.
|
|
// This software is provided "as is" without express or implied
|
|
// warranty, and with no claim as to its suitability for any purpose.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
// Contact: mcseem@antigrain.com
|
|
// mcseemagg@yahoo.com
|
|
// http://www.antigrain.com
|
|
//
|
|
// [Pascal Port History] -----------------------------------------------------
|
|
//
|
|
// 23.06.2006-Milano: ptrcomp adjustments
|
|
// 23.02.2006-Milano: Unit port establishment
|
|
//
|
|
{ agg_span_gradient_alpha.pas }
|
|
unit
|
|
agg_span_gradient_alpha ;
|
|
|
|
INTERFACE
|
|
|
|
{$I agg_mode.inc }
|
|
{$Q- }
|
|
{$R- }
|
|
uses
|
|
agg_basics ,
|
|
agg_color ,
|
|
agg_array ,
|
|
agg_span_gradient ,
|
|
agg_span_interpolator_linear ,
|
|
agg_span_converter ;
|
|
|
|
{ TYPES DEFINITION }
|
|
type
|
|
gradient_alpha_ptr = ^gradient_alpha;
|
|
gradient_alpha = object(array_base )
|
|
end;
|
|
|
|
span_gradient_alpha = object(span_convertor )
|
|
downscale_shift : unsigned;
|
|
|
|
m_interpolator : span_interpolator_ptr;
|
|
m_gradient_function : gradient_ptr;
|
|
m_alpha_function : gradient_alpha_ptr;
|
|
|
|
m_d1 ,
|
|
m_d2 : int;
|
|
|
|
constructor Construct; overload;
|
|
constructor Construct(
|
|
inter : span_interpolator_ptr;
|
|
gradient_fnc : gradient_ptr;
|
|
alpha_fnc : gradient_alpha_ptr;
|
|
d1 ,d2 : double ); overload;
|
|
|
|
function _interpolator : span_interpolator_ptr;
|
|
function _gradient_function : gradient_ptr;
|
|
function _alpha_function : gradient_alpha_ptr;
|
|
function _d1 : double;
|
|
function _d2 : double;
|
|
|
|
procedure interpolator_ (i : span_interpolator_ptr );
|
|
procedure gradient_function_(gf : gradient_ptr );
|
|
procedure alpha_function_ (af : gradient_alpha_ptr );
|
|
|
|
procedure d1_(v : double );
|
|
procedure d2_(v : double );
|
|
|
|
procedure convert(span : aggclr_ptr; x ,y : int; len : unsigned ); virtual;
|
|
|
|
end;
|
|
|
|
gradient_alpha_x = object
|
|
function array_operator(x : aggclr ) : aggclr;
|
|
|
|
end;
|
|
|
|
gradient_alpha_x_u8 = object
|
|
function array_operator(x : int ) : int8u;
|
|
|
|
end;
|
|
|
|
gradient_alpha_one_munus_x_u8 = object
|
|
function array_operator(x : int ) : int8u;
|
|
|
|
end;
|
|
|
|
{ GLOBAL PROCEDURES }
|
|
|
|
|
|
IMPLEMENTATION
|
|
{ LOCAL VARIABLES & CONSTANTS }
|
|
{ UNIT IMPLEMENTATION }
|
|
{ CONSTRUCT }
|
|
constructor span_gradient_alpha.Construct;
|
|
begin
|
|
m_interpolator :=NIL;
|
|
m_gradient_function:=NIL;
|
|
m_alpha_function :=NIL;
|
|
|
|
downscale_shift:=0;
|
|
|
|
m_d1:=0;
|
|
m_d2:=0;
|
|
|
|
end;
|
|
|
|
{ CONSTRUCT }
|
|
constructor span_gradient_alpha.Construct(
|
|
inter : span_interpolator_ptr;
|
|
gradient_fnc : gradient_ptr;
|
|
alpha_fnc : gradient_alpha_ptr;
|
|
d1 ,d2 : double );
|
|
begin
|
|
m_interpolator :=inter;
|
|
m_gradient_function:=gradient_fnc;
|
|
m_alpha_function :=alpha_fnc;
|
|
|
|
downscale_shift:=m_interpolator.subpixel_shift - gradient_subpixel_shift;
|
|
|
|
m_d1:=trunc(d1 * gradient_subpixel_size );
|
|
m_d2:=trunc(d2 * gradient_subpixel_size );
|
|
|
|
end;
|
|
|
|
{ _INTERPOLATOR }
|
|
function span_gradient_alpha._interpolator;
|
|
begin
|
|
result:=m_interpolator;
|
|
|
|
end;
|
|
|
|
{ _GRADIENT_FUNCTION }
|
|
function span_gradient_alpha._gradient_function;
|
|
begin
|
|
result:=m_gradient_function;
|
|
|
|
end;
|
|
|
|
{ _ALPHA_FUNCTION }
|
|
function span_gradient_alpha._alpha_function;
|
|
begin
|
|
result:=m_alpha_function;
|
|
|
|
end;
|
|
|
|
{ _D1 }
|
|
function span_gradient_alpha._d1;
|
|
begin
|
|
result:=m_d1 / gradient_subpixel_size;
|
|
|
|
end;
|
|
|
|
{ _D2 }
|
|
function span_gradient_alpha._d2;
|
|
begin
|
|
result:=m_d2 / gradient_subpixel_size;
|
|
|
|
end;
|
|
|
|
{ INTERPOLATOR_ }
|
|
procedure span_gradient_alpha.interpolator_;
|
|
begin
|
|
m_interpolator:=i;
|
|
|
|
end;
|
|
|
|
{ GRADIENT_FUNCTION_ }
|
|
procedure span_gradient_alpha.gradient_function_;
|
|
begin
|
|
m_gradient_function:=gf;
|
|
|
|
end;
|
|
|
|
{ ALPHA_FUNCTION_ }
|
|
procedure span_gradient_alpha.alpha_function_;
|
|
begin
|
|
m_alpha_function:=af;
|
|
|
|
end;
|
|
|
|
{ D1_ }
|
|
procedure span_gradient_alpha.d1_;
|
|
begin
|
|
m_d1:=trunc(v * gradient_subpixel_size );
|
|
|
|
end;
|
|
|
|
{ D2_ }
|
|
procedure span_gradient_alpha.d2_;
|
|
begin
|
|
m_d2:=trunc(v * gradient_subpixel_size );
|
|
|
|
end;
|
|
|
|
{ CONVERT }
|
|
procedure span_gradient_alpha.convert;
|
|
var
|
|
dd ,d : int;
|
|
|
|
begin
|
|
dd:=m_d2 - m_d1;
|
|
|
|
if dd < 1 then
|
|
dd:=1;
|
|
|
|
m_interpolator.begin_(x + 0.5 ,y + 0.5 ,len );
|
|
|
|
repeat
|
|
m_interpolator.coordinates(@x ,@y );
|
|
|
|
d:=
|
|
m_gradient_function.calculate(
|
|
shr_int32(x ,downscale_shift ) ,
|
|
shr_int32(y ,downscale_shift ) ,
|
|
m_d2 );
|
|
|
|
d:=((d - m_d1 ) * m_alpha_function.size ) div dd;
|
|
|
|
if d < 0 then
|
|
d:=0;
|
|
|
|
if d >= m_alpha_function.size then
|
|
d:=m_alpha_function.size - 1;
|
|
|
|
span.a:=int8u_ptr(m_alpha_function.array_operator(d ) )^;
|
|
|
|
inc(ptrcomp(span ) ,sizeof(aggclr ) );
|
|
|
|
m_interpolator.inc_operator;
|
|
|
|
dec(len );
|
|
|
|
until len = 0;
|
|
|
|
end;
|
|
|
|
{ ARRAY_OPERATOR }
|
|
function gradient_alpha_x.array_operator;
|
|
begin
|
|
result:=x;
|
|
|
|
end;
|
|
|
|
{ ARRAY_OPERATOR }
|
|
function gradient_alpha_x_u8.array_operator;
|
|
begin
|
|
result:=int8u(x );
|
|
|
|
end;
|
|
|
|
{ ARRAY_OPERATOR }
|
|
function gradient_alpha_one_munus_x_u8.array_operator;
|
|
begin
|
|
result:=int8u(255 - x );
|
|
|
|
end;
|
|
|
|
END.
|
|
|