1
//----------------------------------------------------------------------------
2
// Anti-Grain Geometry - Version 2.4 (Public License)
3
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
5
// Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
6
// Pascal Port By: Milan Marusinec alias Milano
8
// http://www.aggpas.org
9
// Copyright (c) 2005-2006
11
// Permission to copy, use, modify, sell and distribute this software
12
// is granted provided this copyright notice appears in all copies.
13
// This software is provided "as is" without express or implied
14
// warranty, and with no claim as to its suitability for any purpose.
16
//----------------------------------------------------------------------------
17
// Contact: mcseem@antigrain.com
18
// mcseemagg@yahoo.com
19
// http://www.antigrain.com
21
// [Pascal Port History] -----------------------------------------------------
23
// 27.01.2006-Milano: Unit port establishment
25
{ agg_span_interpolator_linear.pas }
27
agg_span_interpolator_linear ;
41
span_interpolator_ptr = ^span_interpolator;
42
span_interpolator = object
44
subpixel_size : unsigned;
46
constructor Construct(SS : unsigned = 8 );
48
function _transformer : trans_affine_ptr; virtual; abstract;
49
procedure transformer_(trans : trans_affine_ptr ); virtual; abstract;
51
procedure begin_(x ,y : double; len : unsigned ); virtual; abstract;
53
procedure resynchronize(xe ,ye : double; len : unsigned ); virtual; abstract;
55
procedure inc_operator; virtual; abstract;
56
procedure coordinates(x ,y : int_ptr ); virtual; abstract;
58
procedure local_scale(x ,y : int_ptr ); virtual;
62
//================================================span_interpolator_linear
63
span_interpolator_linear_ptr = ^span_interpolator_linear;
64
span_interpolator_linear = object(span_interpolator )
65
m_trans : trans_affine_ptr;
67
m_li_y : dda2_line_interpolator;
69
constructor Construct(SS : unsigned = 8 ); overload;
70
constructor Construct(trans : trans_affine_ptr; SS : unsigned = 8 ); overload;
71
constructor Construct(trans : trans_affine_ptr; x ,y : double; len : unsigned; SS : unsigned = 8 ); overload;
73
function _transformer : trans_affine_ptr; virtual;
74
procedure transformer_(trans : trans_affine_ptr ); virtual;
76
procedure begin_(x ,y : double; len : unsigned ); virtual;
78
procedure resynchronize(xe ,ye : double; len : unsigned ); virtual;
80
procedure inc_operator; virtual;
81
procedure coordinates(x ,y : int_ptr ); virtual;
85
//=====================================span_interpolator_linear_subdiv
86
span_interpolator_linear_subdiv = object(span_interpolator )
89
m_subdiv_mask : unsigned;
91
m_trans : trans_affine_ptr;
93
m_li_y : dda2_line_interpolator;
100
constructor Construct(SS : unsigned = 8 ); overload;
101
constructor Construct(trans : trans_affine_ptr; subdiv_shift : unsigned = 4; SS : unsigned = 8 ); overload;
102
constructor Construct(trans : trans_affine_ptr; x ,y : double; len : unsigned; subdiv_shift : unsigned = 4; SS : unsigned = 8 ); overload;
104
function _transformer : trans_affine_ptr; virtual;
105
procedure transformer_(trans : trans_affine_ptr ); virtual;
107
function _subdiv_shift : unsigned;
108
procedure subdiv_shift_(shift : unsigned );
110
procedure begin_(x ,y : double; len : unsigned ); virtual;
112
procedure inc_operator; virtual;
113
procedure coordinates(x ,y : int_ptr ); virtual;
117
{ GLOBAL PROCEDURES }
121
{ LOCAL VARIABLES & CONSTANTS }
122
{ UNIT IMPLEMENTATION }
124
constructor span_interpolator.Construct;
127
subpixel_size :=1 shl subpixel_shift;
132
procedure span_interpolator.local_scale;
137
constructor span_interpolator_linear.Construct(SS : unsigned = 8 );
139
inherited Construct(SS );
144
constructor span_interpolator_linear.Construct(trans : trans_affine_ptr; SS : unsigned = 8 );
153
constructor span_interpolator_linear.Construct(trans : trans_affine_ptr; x ,y : double; len : unsigned; SS : unsigned = 8 );
155
Construct(trans ,SS );
162
function span_interpolator_linear._transformer;
169
procedure span_interpolator_linear.transformer_;
176
procedure span_interpolator_linear.begin_;
180
x1 ,y1 ,x2 ,y2 : int;
186
m_trans.transform(m_trans ,@tx ,@ty );
188
x1:=trunc(tx * subpixel_size );
189
y1:=trunc(ty * subpixel_size );
194
m_trans.transform(m_trans ,@tx ,@ty );
196
x2:=trunc(tx * subpixel_size );
197
y2:=trunc(ty * subpixel_size );
199
m_li_x.Construct(x1 ,x2 ,len );
200
m_li_y.Construct(y1 ,y2 ,len );
205
procedure span_interpolator_linear.resynchronize;
207
m_trans.transform(m_trans ,@xe ,@ye );
209
m_li_x.Construct(m_li_x._y ,trunc(xe * subpixel_size ) ,len );
210
m_li_y.Construct(m_li_y._y ,trunc(ye * subpixel_size ) ,len );
215
procedure span_interpolator_linear.inc_operator;
217
m_li_x.plus_operator;
218
m_li_y.plus_operator;
223
procedure span_interpolator_linear.coordinates;
231
constructor span_interpolator_linear_subdiv.Construct(SS : unsigned = 8 );
233
inherited Construct(SS );
236
m_subdiv_size :=1 shl m_subdiv_shift;
237
m_subdiv_mask :=m_subdiv_size - 1;
242
constructor span_interpolator_linear_subdiv.Construct(trans : trans_affine_ptr; subdiv_shift : unsigned = 4; SS : unsigned = 8 );
244
inherited Construct(SS );
246
m_subdiv_shift:=subdiv_shift;
247
m_subdiv_size :=1 shl m_subdiv_shift;
248
m_subdiv_mask :=m_subdiv_size - 1;
255
constructor span_interpolator_linear_subdiv.Construct(trans : trans_affine_ptr; x ,y : double; len : unsigned; subdiv_shift : unsigned = 4; SS : unsigned = 8 );
257
Construct(trans ,subdiv_shift ,SS );
264
function span_interpolator_linear_subdiv._transformer;
271
procedure span_interpolator_linear_subdiv.transformer_;
278
function span_interpolator_linear_subdiv._subdiv_shift;
280
result:=m_subdiv_shift;
285
procedure span_interpolator_linear_subdiv.subdiv_shift_;
287
m_subdiv_shift:=shift;
288
m_subdiv_size :=1 shl m_subdiv_shift;
289
m_subdiv_mask :=m_subdiv_size - 1;
294
procedure span_interpolator_linear_subdiv.begin_;
301
m_src_x:=trunc(x * subpixel_size ) + subpixel_size;
305
if len > m_subdiv_size then
311
m_trans.transform(m_trans ,@tx ,@ty );
313
x1:=trunc(tx * subpixel_size );
314
y1:=trunc(ty * subpixel_size );
319
m_trans.transform(m_trans ,@tx ,@ty );
321
m_li_x.Construct(x1 ,trunc(tx * subpixel_size ) ,len );
322
m_li_y.Construct(y1 ,trunc(ty * subpixel_size ) ,len );
327
procedure span_interpolator_linear_subdiv.inc_operator;
334
m_li_x.plus_operator;
335
m_li_y.plus_operator;
337
if m_pos >= m_subdiv_size then
341
if len > m_subdiv_size then
344
tx:=m_src_x / subpixel_size + len;
347
m_trans.transform(m_trans ,@tx ,@ty );
349
m_li_x.Construct(m_li_x._y ,trunc(tx * subpixel_size ) ,len );
350
m_li_y.Construct(m_li_y._y ,trunc(ty * subpixel_size ) ,len );
356
inc(m_src_x ,subpixel_size );
363
procedure span_interpolator_linear_subdiv.coordinates;