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
// 23.06.2006-Milano: ptrcomp adjustments
24
// 01.02.2006-Milano: Complete unit port
25
// 31.01.2006-Milano: Unit port establishment
27
{ agg_renderer_outline_aa.pas }
29
agg_renderer_outline_aa ;
42
agg_ellipse_bresenham ,
51
subpixel_shift = line_subpixel_shift;
52
subpixel_size = 1 shl subpixel_shift;
53
subpixel_mask = subpixel_size - 1;
56
aa_num = 1 shl aa_shift;
60
distance_interpolator_ptr = ^distance_interpolator;
61
distance_interpolator = object
62
procedure inc_x_; virtual; abstract;
63
procedure dec_x_; virtual; abstract;
64
procedure inc_y_; virtual; abstract;
65
procedure dec_y_; virtual; abstract;
67
procedure inc_x(dy_ : int ); virtual; abstract;
68
procedure dec_x(dy_ : int ); virtual; abstract;
69
procedure inc_y(dx_ : int ); virtual; abstract;
70
procedure dec_y(dx_ : int ); virtual; abstract;
72
function dist : int; virtual; abstract;
73
function dist_start : int; virtual; abstract;
74
function dist_end : int; virtual; abstract;
76
function dx : int; virtual; abstract;
77
function dy : int; virtual; abstract;
78
function dx_start : int; virtual; abstract;
79
function dy_start : int; virtual; abstract;
80
function dx_end : int; virtual; abstract;
81
function dy_end : int; virtual; abstract;
85
distance_interpolator0 = object(distance_interpolator )
90
constructor Construct; overload;
91
constructor Construct(x1 ,y1 ,x2 ,y2 ,x ,y : int ); overload;
93
procedure inc_x_; virtual;
94
procedure dec_x_; virtual;
95
procedure inc_y_; virtual;
96
procedure dec_y_; virtual;
98
procedure inc_x(dy_ : int ); virtual;
99
procedure dec_x(dy_ : int ); virtual;
100
procedure inc_y(dx_ : int ); virtual;
101
procedure dec_y(dx_ : int ); virtual;
103
function dist : int; virtual;
104
function dx : int; virtual;
105
function dy : int; virtual;
109
distance_interpolator1 = object(distance_interpolator )
114
constructor Construct; overload;
115
constructor Construct(x1 ,y1 ,x2 ,y2 ,x ,y : int ); overload;
117
procedure inc_x_; virtual;
118
procedure dec_x_; virtual;
119
procedure inc_y_; virtual;
120
procedure dec_y_; virtual;
122
procedure inc_x(dy_ : int ); virtual;
123
procedure dec_x(dy_ : int ); virtual;
124
procedure inc_y(dx_ : int ); virtual;
125
procedure dec_y(dx_ : int ); virtual;
127
function dist : int; virtual;
128
function dx : int; virtual;
129
function dy : int; virtual;
133
distance_interpolator2 = object(distance_interpolator )
140
m_dist ,m_dist_start : int;
142
constructor Construct; overload;
143
constructor Construct(x1 ,y1 ,x2 ,y2 ,sx ,sy ,x ,y : int ); overload;
144
constructor Construct(x1 ,y1 ,x2 ,y2 ,ex ,ey ,x ,y ,z : int ); overload;
146
procedure inc_x_; virtual;
147
procedure dec_x_; virtual;
148
procedure inc_y_; virtual;
149
procedure dec_y_; virtual;
151
procedure inc_x(dy_ : int ); virtual;
152
procedure dec_x(dy_ : int ); virtual;
153
procedure inc_y(dx_ : int ); virtual;
154
procedure dec_y(dx_ : int ); virtual;
156
function dist : int; virtual;
157
function dist_start : int; virtual;
158
function dist_end : int; virtual;
160
function dx : int; virtual;
161
function dy : int; virtual;
162
function dx_start : int; virtual;
163
function dy_start : int; virtual;
164
function dx_end : int; virtual;
165
function dy_end : int; virtual;
169
distance_interpolator3 = object(distance_interpolator )
179
m_dist ,m_dist_start ,m_dist_end : int;
181
constructor Construct; overload;
182
constructor Construct(x1 ,y1 ,x2 ,y2 ,sx ,sy ,ex ,ey ,x ,y : int ); overload;
184
procedure inc_x_; virtual;
185
procedure dec_x_; virtual;
186
procedure inc_y_; virtual;
187
procedure dec_y_; virtual;
189
procedure inc_x(dy_ : int ); virtual;
190
procedure dec_x(dy_ : int ); virtual;
191
procedure inc_y(dx_ : int ); virtual;
192
procedure dec_y(dx_ : int ); virtual;
194
function dist : int; virtual;
195
function dist_start : int; virtual;
196
function dist_end : int; virtual;
198
function dx : int; virtual;
199
function dy : int; virtual;
200
function dx_start : int; virtual;
201
function dy_start : int; virtual;
202
function dx_end : int; virtual;
203
function dy_end : int; virtual;
207
renderer_outline_aa_ptr = ^renderer_outline_aa;
209
line_interpolator = object
210
function step_hor : boolean; virtual; abstract;
211
function step_ver : boolean; virtual; abstract;
213
function width : int; virtual; abstract;
214
function count : int; virtual; abstract;
218
line_interpolator_aa_base = object //(line_interpolator )
219
m_lp : line_parameters_ptr;
220
m_li : dda2_line_interpolator;
221
m_ren : renderer_outline_aa_ptr;
235
m_dist : array[0..max_half_width + 1 - 1 ] of int;
236
m_covers : array[0..max_half_width * 2 + 4 - 1 ] of int8u;
238
constructor Construct(ren : renderer_outline_aa_ptr; lp : line_parameters_ptr );
240
function step_hor : boolean; virtual; abstract;
241
function step_ver : boolean; virtual; abstract;
243
function step_hor_base(di : distance_interpolator_ptr ) : int;
244
function step_ver_base(di : distance_interpolator_ptr ) : int;
246
function vertical : boolean;
248
function width : int; virtual;
249
function count : int; virtual;
253
line_interpolator_aa0_ptr = ^line_interpolator_aa0;
254
line_interpolator_aa0 = object(line_interpolator_aa_base )
255
m_di : distance_interpolator1;
257
constructor Construct(ren : renderer_outline_aa_ptr; lp : line_parameters_ptr );
259
function step_hor : boolean; virtual;
260
function step_ver : boolean; virtual;
264
line_interpolator_aa1_ptr = ^line_interpolator_aa1;
265
line_interpolator_aa1 = object(line_interpolator_aa_base )
266
m_di : distance_interpolator2;
268
constructor Construct(ren : renderer_outline_aa_ptr; lp : line_parameters_ptr; sx ,sy : int );
270
function step_hor : boolean; virtual;
271
function step_ver : boolean; virtual;
275
line_interpolator_aa2_ptr = ^line_interpolator_aa2;
276
line_interpolator_aa2 = object(line_interpolator_aa_base )
277
m_di : distance_interpolator2;
279
constructor Construct(ren : renderer_outline_aa_ptr; lp : line_parameters_ptr; ex ,ey : int );
281
function step_hor : boolean; virtual;
282
function step_ver : boolean; virtual;
286
line_interpolator_aa3_ptr = ^line_interpolator_aa3;
287
line_interpolator_aa3 = object(line_interpolator_aa_base )
288
m_di : distance_interpolator3;
290
constructor Construct(ren : renderer_outline_aa_ptr; lp : line_parameters_ptr; sx ,sy ,ex ,ey : int );
292
function step_hor : boolean; virtual;
293
function step_ver : boolean; virtual;
297
line_profile_aa_ptr = ^line_profile_aa;
298
line_profile_aa = object
300
m_profile : int8u_ptr;
301
m_gamma : array[0..aa_num - 1 ] of int8u;
303
m_subpixel_width : int;
305
m_smoother_width : double;
307
constructor Construct; overload;
308
constructor Construct(w : double; gamma_function : vertex_source_ptr ); overload;
311
procedure min_width_ (w : double );
312
procedure smoother_width_(w : double );
314
procedure gamma_(gamma_function : vertex_source_ptr );
315
procedure width_(w : double );
317
function _profile_size : unsigned;
318
function _subpixel_width : int;
320
function _min_width : double;
321
function _smoother_width : double;
323
function value(dist : int ) : int8u;
325
function profile(w : double ) : int8u_ptr;
326
procedure set_ (center_width ,smoother_width : double );
330
cmp_function = function(d : int ) : boolean;
332
renderer_outline_ptr = ^renderer_outline;
333
renderer_outline = object
334
procedure color_(c : aggclr_ptr ); virtual; abstract;
336
function subpixel_width : int; virtual; abstract;
337
function accurate_join_only : boolean; virtual; abstract;
339
procedure semidot(cmp : cmp_function; xc1 ,yc1 ,xc2 ,yc2 : int ); virtual; abstract;
341
procedure line0(lp : line_parameters_ptr ); virtual; abstract;
342
procedure line1(lp : line_parameters_ptr; sx ,sy : int ); virtual; abstract;
343
procedure line2(lp : line_parameters_ptr; ex ,ey : int ); virtual; abstract;
344
procedure line3(lp : line_parameters_ptr; sx ,sy ,ex ,ey : int ); virtual; abstract;
348
renderer_outline_aa = object(renderer_outline )
349
m_ren : renderer_base_ptr;
350
m_profile : line_profile_aa_ptr;
353
constructor Construct(ren : renderer_base_ptr; prof : line_profile_aa_ptr );
355
procedure color_(c : aggclr_ptr ); virtual;
356
function _color : aggclr_ptr;
358
procedure profile_(prof : line_profile_aa_ptr );
359
function _profile : line_profile_aa_ptr;
361
function subpixel_width : int; virtual;
362
function cover(d : int ) : int8u;
364
procedure blend_solid_hspan(x ,y : int; len : unsigned; covers : int8u_ptr );
365
procedure blend_solid_vspan(x ,y : int; len : unsigned; covers : int8u_ptr );
367
function accurate_join_only : boolean; virtual;
369
procedure semidot_hline(cmp : cmp_function; xc1 ,yc1 ,xc2 ,yc2 ,x1 ,y1 ,x2 : int );
370
procedure semidot (cmp : cmp_function; xc1 ,yc1 ,xc2 ,yc2 : int ); virtual;
372
procedure line0(lp : line_parameters_ptr ); virtual;
373
procedure line1(lp : line_parameters_ptr; sx ,sy : int ); virtual;
374
procedure line2(lp : line_parameters_ptr; ex ,ey : int ); virtual;
375
procedure line3(lp : line_parameters_ptr; sx ,sy ,ex ,ey : int ); virtual;
379
{ GLOBAL PROCEDURES }
383
{ LOCAL VARIABLES & CONSTANTS }
384
{ UNIT IMPLEMENTATION }
386
constructor distance_interpolator0.Construct;
391
constructor distance_interpolator0.Construct(x1 ,y1 ,x2 ,y2 ,x ,y : int );
393
m_dx:=line_mr(x2 ) - line_mr(x1 );
394
m_dy:=line_mr(y2 ) - line_mr(y1 );
397
(line_mr(x + line_subpixel_size div 2 ) - line_mr(x2 ) ) * m_dy -
398
(line_mr(y + line_subpixel_size div 2 ) - line_mr(y2 ) ) * m_dx;
400
m_dx:=m_dx shl line_mr_subpixel_shift;
401
m_dy:=m_dy shl line_mr_subpixel_shift;
406
procedure distance_interpolator0.inc_x_;
413
procedure distance_interpolator0.dec_x_;
420
procedure distance_interpolator0.inc_y_;
427
procedure distance_interpolator0.dec_y_;
434
procedure distance_interpolator0.inc_x(dy_ : int );
447
procedure distance_interpolator0.dec_x(dy_ : int );
460
procedure distance_interpolator0.inc_y(dx_ : int );
473
procedure distance_interpolator0.dec_y(dx_ : int );
486
function distance_interpolator0.dist;
493
function distance_interpolator0.dx;
500
function distance_interpolator0.dy;
507
constructor distance_interpolator1.Construct;
512
constructor distance_interpolator1.Construct(x1 ,y1 ,x2 ,y2 ,x ,y : int );
519
(x + line_subpixel_size / 2 - x2 ) * m_dy -
520
(y + line_subpixel_size / 2 - y2 ) * m_dx );
522
m_dx:=m_dx shl line_subpixel_shift;
523
m_dy:=m_dy shl line_subpixel_shift;
528
procedure distance_interpolator1.inc_x_;
535
procedure distance_interpolator1.dec_x_;
542
procedure distance_interpolator1.inc_y_;
549
procedure distance_interpolator1.dec_y_;
556
procedure distance_interpolator1.inc_x(dy_ : int );
569
procedure distance_interpolator1.dec_x(dy_ : int );
582
procedure distance_interpolator1.inc_y(dx_ : int );
595
procedure distance_interpolator1.dec_y(dx_ : int );
608
function distance_interpolator1.dist;
615
function distance_interpolator1.dx;
622
function distance_interpolator1.dy;
629
constructor distance_interpolator2.Construct;
634
constructor distance_interpolator2.Construct(x1 ,y1 ,x2 ,y2 ,sx ,sy ,x ,y : int );
639
m_dx_start:=line_mr(sx ) - line_mr(x1 );
640
m_dy_start:=line_mr(sy ) - line_mr(y1 );
644
(x + line_subpixel_size / 2 - x2 ) * m_dy -
645
(y + line_subpixel_size / 2 - y2 ) * m_dx );
648
(line_mr(x + line_subpixel_size div 2 ) - line_mr(sx ) ) * m_dy_start -
649
(line_mr(y + line_subpixel_size div 2 ) - line_mr(sy ) ) * m_dx_start;
651
m_dx:=m_dx shl line_subpixel_shift;
652
m_dy:=m_dy shl line_subpixel_shift;
654
m_dx_start:=m_dx_start shl line_mr_subpixel_shift;
655
m_dy_start:=m_dy_start shl line_mr_subpixel_shift;
660
constructor distance_interpolator2.Construct(x1 ,y1 ,x2 ,y2 ,ex ,ey ,x ,y ,z : int );
665
m_dx_start:=line_mr(ex ) - line_mr(x2 );
666
m_dy_start:=line_mr(ey ) - line_mr(y2 );
670
(x + line_subpixel_size / 2 - x2 ) * m_dy -
671
(y + line_subpixel_size / 2 - y2 ) * m_dx );
674
(line_mr(x + line_subpixel_size div 2 ) - line_mr(ex ) ) * m_dy_start -
675
(line_mr(y + line_subpixel_size div 2 ) - line_mr(ey ) ) * m_dx_start;
677
m_dx:=m_dx shl line_subpixel_shift;
678
m_dy:=m_dy shl line_subpixel_shift;
680
m_dx_start:=m_dx_start shl line_mr_subpixel_shift;
681
m_dy_start:=m_dy_start shl line_mr_subpixel_shift;
686
procedure distance_interpolator2.inc_x_;
689
inc(m_dist_start ,m_dy_start );
694
procedure distance_interpolator2.dec_x_;
697
dec(m_dist_start ,m_dy_start );
702
procedure distance_interpolator2.inc_y_;
705
dec(m_dist_start ,m_dx_start );
710
procedure distance_interpolator2.dec_y_;
713
inc(m_dist_start ,m_dx_start );
718
procedure distance_interpolator2.inc_x(dy_ : int );
721
inc(m_dist_start ,m_dy_start );
726
dec(m_dist_start ,m_dx_start );
733
inc(m_dist_start ,m_dx_start );
740
procedure distance_interpolator2.dec_x(dy_ : int );
743
dec(m_dist_start ,m_dy_start );
748
dec(m_dist_start ,m_dx_start );
755
inc(m_dist_start ,m_dx_start );
762
procedure distance_interpolator2.inc_y(dx_ : int );
765
dec(m_dist_start ,m_dx_start );
770
inc(m_dist_start ,m_dy_start );
777
dec(m_dist_start ,m_dy_start );
784
procedure distance_interpolator2.dec_y(dx_ : int );
787
inc(m_dist_start ,m_dx_start );
792
inc(m_dist_start ,m_dy_start );
799
dec(m_dist_start ,m_dy_start );
806
function distance_interpolator2.dist;
813
function distance_interpolator2.dist_start;
815
result:=m_dist_start;
820
function distance_interpolator2.dist_end;
822
result:=m_dist_start;
827
function distance_interpolator2.dx;
834
function distance_interpolator2.dy;
841
function distance_interpolator2.dx_start;
848
function distance_interpolator2.dy_start;
855
function distance_interpolator2.dx_end;
862
function distance_interpolator2.dy_end;
869
constructor distance_interpolator3.Construct;
874
constructor distance_interpolator3.Construct(x1 ,y1 ,x2 ,y2 ,sx ,sy ,ex ,ey ,x ,y : int );
879
m_dx_start:=line_mr(sx ) - line_mr(x1 );
880
m_dy_start:=line_mr(sy ) - line_mr(y1 );
882
m_dx_end:=line_mr(ex ) - line_mr(x2 );
883
m_dy_end:=line_mr(ey ) - line_mr(y2 );
887
(x + line_subpixel_size / 2 - x2 ) * m_dy -
888
(y + line_subpixel_size / 2 - y2 ) * m_dx );
891
(line_mr(x + line_subpixel_size div 2 ) - line_mr(sx ) ) * m_dy_start -
892
(line_mr(y + line_subpixel_size div 2 ) - line_mr(sy ) ) * m_dx_start;
895
(line_mr(x + line_subpixel_size div 2 ) - line_mr(ex ) ) * m_dy_end -
896
(line_mr(y + line_subpixel_size div 2 ) - line_mr(ey ) ) * m_dx_end;
898
m_dx:=m_dx shl line_subpixel_shift;
899
m_dy:=m_dy shl line_subpixel_shift;
901
m_dx_start:=m_dx_start shl line_mr_subpixel_shift;
902
m_dy_start:=m_dy_start shl line_mr_subpixel_shift;
904
m_dx_end:=m_dx_end shl line_mr_subpixel_shift;
905
m_dy_end:=m_dy_end shl line_mr_subpixel_shift;
910
procedure distance_interpolator3.inc_x_;
913
inc(m_dist_start ,m_dy_start );
914
inc(m_dist_end ,m_dy_end );
919
procedure distance_interpolator3.dec_x_;
922
dec(m_dist_start ,m_dy_start );
923
dec(m_dist_end ,m_dy_end );
928
procedure distance_interpolator3.inc_y_;
931
dec(m_dist_start ,m_dx_start );
932
dec(m_dist_end ,m_dx_end );
937
procedure distance_interpolator3.dec_y_;
940
inc(m_dist_start ,m_dx_start );
941
inc(m_dist_end ,m_dx_end );
946
procedure distance_interpolator3.inc_x(dy_ : int );
949
inc(m_dist_start ,m_dy_start );
950
inc(m_dist_end ,m_dy_end );
955
dec(m_dist_start ,m_dx_start );
956
dec(m_dist_end ,m_dx_end );
963
inc(m_dist_start ,m_dx_start );
964
inc(m_dist_end ,m_dx_end );
971
procedure distance_interpolator3.dec_x(dy_ : int );
974
dec(m_dist_start ,m_dy_start );
975
dec(m_dist_end ,m_dy_end );
980
dec(m_dist_start ,m_dx_start );
981
dec(m_dist_end ,m_dx_end );
988
inc(m_dist_start ,m_dx_start );
989
inc(m_dist_end ,m_dx_end );
996
procedure distance_interpolator3.inc_y(dx_ : int );
999
dec(m_dist_start ,m_dx_start );
1000
dec(m_dist_end ,m_dx_end );
1005
inc(m_dist_start ,m_dy_start );
1006
inc(m_dist_end ,m_dy_end );
1013
dec(m_dist_start ,m_dy_start );
1014
dec(m_dist_end ,m_dy_end );
1021
procedure distance_interpolator3.dec_y(dx_ : int );
1024
inc(m_dist_start ,m_dx_start );
1025
inc(m_dist_end ,m_dx_end );
1030
inc(m_dist_start ,m_dy_start );
1031
inc(m_dist_end ,m_dy_end );
1038
dec(m_dist_start ,m_dy_start );
1039
dec(m_dist_end ,m_dy_end );
1046
function distance_interpolator3.dist;
1053
function distance_interpolator3.dist_start;
1055
result:=m_dist_start;
1060
function distance_interpolator3.dist_end;
1067
function distance_interpolator3.dx;
1074
function distance_interpolator3.dy;
1081
function distance_interpolator3.dx_start;
1088
function distance_interpolator3.dy_start;
1095
function distance_interpolator3.dx_end;
1102
function distance_interpolator3.dy_end;
1109
constructor line_interpolator_aa_base.Construct;
1111
li : dda2_line_interpolator;
1120
m_li.Construct(line_dbl_hr(lp.x2 - lp.x1 ) ,Abs(lp.y2 - lp.y1 ) )
1122
m_li.Construct(line_dbl_hr(lp.y2 - lp.y1 ) ,Abs(lp.x2 - lp.x1) + 1 );
1126
if lp.vertical = (lp.inc_ > 0 ) then
1131
m_x:=shr_int32(lp.x1 ,line_subpixel_shift );
1132
m_y:=shr_int32(lp.y1 ,line_subpixel_shift );
1138
m_count:=Abs(shr_int32(lp.y2 ,line_subpixel_shift) - m_y )
1140
m_count:=Abs(shr_int32(lp.x2 ,line_subpixel_shift) - m_x );
1142
m_width :=ren.subpixel_width;
1143
m_max_extent:=shr_int32(m_width ,line_subpixel_shift - 2 );
1147
li.Construct(0 ,lp.dy shl line_subpixel_shift ,lp.len )
1149
li.Construct(0 ,lp.dx shl line_subpixel_shift ,lp.len );
1151
stop:=m_width + line_subpixel_size * 2;
1155
while i < max_half_width do
1159
if m_dist[i ] >= stop then
1168
m_dist[i ]:=$7FFF0000;
1173
function line_interpolator_aa_base.step_hor_base;
1177
inc(m_x ,m_lp.inc_ );
1179
m_y:=shr_int32(m_lp.y1 + m_li._y ,line_subpixel_shift );
1181
if m_lp.inc_ > 0 then
1182
di.inc_x(m_y - m_old_y )
1184
di.dec_x(m_y - m_old_y );
1188
result:=di.dist div m_len;
1193
function line_interpolator_aa_base.step_ver_base;
1197
inc(m_y ,m_lp.inc_ );
1199
m_x:=shr_int32(m_lp.x1 + m_li._y ,line_subpixel_shift );
1201
if m_lp.inc_ > 0 then
1202
di.inc_y(m_x - m_old_x )
1204
di.dec_y(m_x - m_old_x );
1208
result:=di.dist div m_len;
1213
function line_interpolator_aa_base.vertical;
1215
result:=m_lp.vertical;
1220
function line_interpolator_aa_base.width;
1227
function line_interpolator_aa_base.count;
1234
constructor line_interpolator_aa0.Construct;
1236
inherited Construct(ren ,lp );
1239
lp.x1 ,lp.y1 ,lp.x2 ,lp.y2 ,
1240
lp.x1 and not line_subpixel_mask ,
1241
lp.y1 and not line_subpixel_mask );
1243
m_li.adjust_forward;
1248
function line_interpolator_aa0.step_hor;
1255
s1:=step_hor_base(@m_di );
1256
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1259
p1^:=int8u(m_ren.cover(s1 ) );
1261
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1264
dist:=m_dist[dy ] - s1;
1266
while dist <= m_width do
1268
p1^:=int8u(m_ren.cover(dist ) );
1270
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1273
dist:=m_dist[dy ] - s1;
1278
dist:=m_dist[dy ] + s1;
1280
while dist <= m_width do
1282
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1284
p0^:=int8u(m_ren.cover(dist ) );
1288
dist:=m_dist[dy ] + s1;
1292
m_ren.blend_solid_vspan(
1294
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1299
result:=m_step < m_count;
1304
function line_interpolator_aa0.step_ver;
1311
s1:=step_ver_base(@m_di );
1312
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1315
p1^:=int8u(m_ren.cover(s1 ) );
1317
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1320
dist:=m_dist[dx ] - s1;
1322
while dist <= m_width do
1324
p1^:=int8u(m_ren.cover(dist ) );
1326
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1329
dist:=m_dist[dx ] - s1;
1334
dist:=m_dist[dx ] + s1;
1336
while dist <= m_width do
1338
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1340
p0^:=int8u(m_ren.cover(dist ) );
1344
dist:=m_dist[dx ] + s1;
1348
m_ren.blend_solid_hspan(
1350
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1355
result:=m_step < m_count;
1360
constructor line_interpolator_aa1.Construct;
1362
dist1_start ,dist2_start ,npix ,dx ,dy : int;
1365
inherited Construct(ren ,lp );
1368
lp.x1 ,lp.y1 ,lp.x2 ,lp.y2 ,sx ,sy ,
1369
lp.x1 and not line_subpixel_mask ,
1370
lp.y1 and not line_subpixel_mask );
1376
m_li.minus_operator;
1380
m_x:=shr_int32(m_lp.x1 + m_li._y ,line_subpixel_shift );
1383
m_di.dec_y(m_x - m_old_x )
1385
m_di.inc_y(m_x - m_old_x );
1389
dist1_start:=m_di.dist_start;
1390
dist2_start:=dist1_start;
1394
if dist1_start < 0 then
1398
inc(dist1_start ,m_di.dy_start );
1399
dec(dist2_start ,m_di.dy_start );
1401
if dist1_start < 0 then
1404
if dist2_start < 0 then
1409
until m_dist[dx ] > m_width;
1418
until m_step < -m_max_extent
1421
m_li.minus_operator;
1425
m_y:=shr_int32(m_lp.y1 + m_li._y ,line_subpixel_shift );
1428
m_di.dec_x(m_y - m_old_y )
1430
m_di.inc_x(m_y - m_old_y );
1434
dist1_start:=m_di.dist_start;
1435
dist2_start:=dist1_start;
1439
if dist1_start < 0 then
1443
dec(dist1_start ,m_di.dx_start );
1444
inc(dist2_start ,m_di.dx_start );
1446
if dist1_start < 0 then
1449
if dist2_start < 0 then
1454
until m_dist[dy ] > m_width;
1463
until m_step < -m_max_extent;
1465
m_li.adjust_forward;
1470
function line_interpolator_aa1.step_hor;
1472
dist_start ,dist ,dy ,s1 : int;
1477
s1:=step_hor_base(@m_di );
1479
dist_start:=m_di.dist_start;
1481
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1486
if dist_start <= 0 then
1487
p1^:=int8u(m_ren.cover(s1 ) );
1489
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1492
dist:=m_dist[dy ] - s1;
1494
while dist <= m_width do
1496
dec(dist_start ,m_di.dx_start );
1500
if dist_start <= 0 then
1501
p1^:=int8u(m_ren.cover(dist ) );
1503
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1506
dist:=m_dist[dy ] - s1;
1511
dist_start:=m_di.dist_start;
1512
dist :=m_dist[dy ] + s1;
1514
while dist <= m_width do
1516
inc(dist_start ,m_di.dx_start );
1517
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1521
if dist_start <= 0 then
1522
p0^:=int8u(m_ren.cover(dist ) );
1526
dist:=m_dist[dy ] + s1;
1530
m_ren.blend_solid_vspan(
1532
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1537
result:=m_step < m_count;
1542
function line_interpolator_aa1.step_ver;
1544
dist_start ,dist ,dx ,s1 : int;
1549
s1:=step_ver_base(@m_di );
1550
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1553
dist_start:=m_di.dist_start;
1557
if dist_start <= 0 then
1558
p1^:=int8u(m_ren.cover(s1 ) );
1560
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1563
dist:=m_dist[dx ] - s1;
1565
while dist <= m_width do
1567
inc(dist_start ,m_di.dy_start );
1571
if dist_start <= 0 then
1572
p1^:=int8u(m_ren.cover(dist ) );
1574
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1577
dist:=m_dist[dx ] - s1;
1582
dist_start:=m_di.dist_start;
1583
dist :=m_dist[dx ] + s1;
1585
while dist <= m_width do
1587
dec(dist_start ,m_di.dy_start );
1588
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1592
if dist_start <= 0 then
1593
p0^:=int8u(m_ren.cover(dist ) );
1597
dist:=m_dist[dx ] + s1;
1601
m_ren.blend_solid_hspan(
1603
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1608
result:=m_step < m_count;
1613
constructor line_interpolator_aa2.Construct;
1615
inherited Construct(ren ,lp );
1618
lp.x1 ,lp.y1 ,lp.x2 ,lp.y2 ,ex ,ey ,
1619
lp.x1 and not line_subpixel_mask ,
1620
lp.y1 and not line_subpixel_mask ,
1623
m_li.adjust_forward;
1625
dec(m_step ,m_max_extent );
1630
function line_interpolator_aa2.step_hor;
1632
dist_end ,dist ,dy ,s1 ,npix : int;
1637
s1:=step_hor_base(@m_di );
1638
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1641
dist_end:=m_di.dist_end;
1646
if dist_end > 0 then
1648
p1^:=int8u(m_ren.cover(s1 ) );
1654
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1657
dist:=m_dist[dy ] - s1;
1659
while dist <= m_width do
1661
dec(dist_end ,m_di.dx_end );
1665
if dist_end > 0 then
1667
p1^:=int8u(m_ren.cover(dist ) );
1673
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1676
dist:=m_dist[dy ] - s1;
1681
dist_end:=m_di.dist_end;
1682
dist :=m_dist[dy ] + s1;
1684
while dist <= m_width do
1686
inc(dist_end ,m_di.dx_end );
1687
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1691
if dist_end > 0 then
1693
p0^:=int8u(m_ren.cover(dist ) );
1701
dist:=m_dist[dy ] + s1;
1705
m_ren.blend_solid_vspan(
1707
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1714
(m_step < m_count );
1719
function line_interpolator_aa2.step_ver;
1721
dist_end ,dist ,dx ,s1 ,npix : int;
1726
s1:=step_ver_base(@m_di );
1727
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1730
dist_end:=m_di.dist_end;
1735
if dist_end > 0 then
1737
p1^:=int8u(m_ren.cover(s1 ) );
1743
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1746
dist:=m_dist[dx ] - s1;
1748
while dist <= m_width do
1750
inc(dist_end ,m_di.dy_end );
1754
if dist_end > 0 then
1756
p1^:=int8u(m_ren.cover(dist ) );
1762
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1765
dist:=m_dist[dx ] - s1;
1770
dist_end:=m_di.dist_end;
1771
dist :=m_dist[dx ] + s1;
1773
while dist <= m_width do
1775
dec(dist_end ,m_di.dy_end );
1776
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1780
if dist_end > 0 then
1782
p0^:=int8u(m_ren.cover(dist ) );
1790
dist:=m_dist[dx ] + s1;
1794
m_ren.blend_solid_hspan(
1796
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
1803
(m_step < m_count );
1808
constructor line_interpolator_aa3.Construct;
1810
dist1_start ,dist2_start ,npix ,dx ,dy : int;
1813
inherited Construct(ren ,lp );
1816
lp.x1 ,lp.y1 ,lp.x2 ,lp.y2 ,sx ,sy ,ex ,ey ,
1817
lp.x1 and not line_subpixel_mask ,
1818
lp.y1 and not line_subpixel_mask );
1824
m_li.minus_operator;
1828
m_x:=shr_int32(m_lp.x1 + m_li._y ,line_subpixel_shift );
1831
m_di.dec_y(m_x - m_old_x )
1833
m_di.inc_y(m_x - m_old_x );
1837
dist1_start:=m_di.dist_start;
1838
dist2_start:=dist1_start;
1842
if dist1_start < 0 then
1846
inc(dist1_start ,m_di.dy_start );
1847
dec(dist2_start ,m_di.dy_start );
1849
if dist1_start < 0 then
1852
if dist2_start < 0 then
1857
until m_dist[dx ] > m_width;
1866
until m_step < -m_max_extent
1869
m_li.minus_operator;
1873
m_y:=shr_int32(m_lp.y1 + m_li._y ,line_subpixel_shift );
1876
m_di.dec_x(m_y - m_old_y )
1878
m_di.inc_x(m_y - m_old_y );
1882
dist1_start:=m_di.dist_start;
1883
dist2_start:=dist1_start;
1887
if dist1_start < 0 then
1891
dec(dist1_start ,m_di.dx_start );
1892
inc(dist2_start ,m_di.dx_start );
1894
if dist1_start < 0 then
1897
if dist2_start < 0 then
1902
until m_dist[dy ] > m_width;
1911
until m_step < -m_max_extent;
1913
m_li.adjust_forward;
1915
dec(m_step ,m_max_extent );
1920
function line_interpolator_aa3.step_hor;
1922
dist_start ,dist_end ,dist ,dy ,s1 ,npix : int;
1927
s1:=step_hor_base(@m_di );
1928
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
1931
dist_start:=m_di.dist_start;
1932
dist_end :=m_di.dist_end;
1937
if dist_end > 0 then
1939
if dist_start <= 0 then
1940
p1^:=int8u(m_ren.cover(s1 ) );
1946
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1949
dist:=m_dist[dy ] - s1;
1951
while dist <= m_width do
1953
dec(dist_start ,m_di.dx_start );
1954
dec(dist_end ,m_di.dx_end );
1958
if (dist_end > 0 ) and
1959
(dist_start <= 0 ) then
1961
p1^:=int8u(m_ren.cover(dist ) );
1967
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
1970
dist:=m_dist[dy ] - s1;
1975
dist_start:=m_di.dist_start;
1976
dist_end :=m_di.dist_end;
1977
dist :=m_dist[dy ] + s1;
1979
while dist <= m_width do
1981
inc(dist_start ,m_di.dx_start );
1982
inc(dist_end ,m_di.dx_end );
1983
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
1987
if (dist_end > 0 ) and
1988
(dist_start <= 0 ) then
1990
p0^:=int8u(m_ren.cover(dist ) );
1998
dist:=m_dist[dy ] + s1;
2002
m_ren.blend_solid_vspan(
2004
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
2011
(m_step < m_count );
2016
function line_interpolator_aa3.step_ver;
2018
dist_start ,dist_end ,dist ,dx ,s1 ,npix : int;
2023
s1:=step_ver_base(@m_di );
2024
p0:=int8u_ptr(ptrcomp(@m_covers[0 ] ) + (max_half_width + 2 ) * sizeof(int8u ) );
2027
dist_start:=m_di.dist_start;
2028
dist_end :=m_di.dist_end;
2033
if dist_end > 0 then
2035
if dist_start <= 0 then
2036
p1^:=int8u(m_ren.cover(s1 ) );
2042
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
2045
dist:=m_dist[dx ] - s1;
2047
while dist <= m_width do
2049
inc(dist_start ,m_di.dy_start );
2050
inc(dist_end ,m_di.dy_end );
2054
if (dist_end > 0 ) and
2055
(dist_start <= 0 ) then
2057
p1^:=int8u(m_ren.cover(dist ) );
2063
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
2066
dist:=m_dist[dx ] - s1;
2071
dist_start:=m_di.dist_start;
2072
dist_end :=m_di.dist_end;
2073
dist :=m_dist[dx ] + s1;
2075
while dist <= m_width do
2077
dec(dist_start ,m_di.dy_start );
2078
dec(dist_end ,m_di.dy_end );
2079
dec(ptrcomp(p0 ) ,sizeof(int8u ) );
2083
if (dist_end > 0 ) and
2084
(dist_start <= 0 ) then
2086
p0^:=int8u(m_ren.cover(dist ) );
2094
dist:=m_dist[dx ] + s1;
2098
m_ren.blend_solid_hspan(
2100
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
2107
(m_step < m_count );
2112
constructor line_profile_aa.Construct;
2120
m_subpixel_width:=0;
2122
m_smoother_width:=1.0;
2124
for i:=0 to aa_num - 1 do
2125
m_gamma[i ]:=int8u(i );
2130
constructor line_profile_aa.Construct(w : double; gamma_function : vertex_source_ptr );
2135
m_subpixel_width:=0;
2137
m_smoother_width:=1.0;
2139
gamma_(gamma_function );
2145
destructor line_profile_aa.Destruct;
2147
agg_freemem(pointer(m_profile ) ,m_size * sizeof(int8u ) );
2152
procedure line_profile_aa.min_width_;
2159
procedure line_profile_aa.smoother_width_;
2161
m_smoother_width:=w;
2166
procedure line_profile_aa.gamma_;
2171
for i:=0 to aa_num - 1 do
2172
m_gamma[i ]:=int8u(trunc(gamma_function.func_operator_gamma(i / aa_mask ) * aa_mask + 0.5 ) );
2177
procedure line_profile_aa.width_;
2185
if w < m_smoother_width then
2188
w:=w + m_smoother_width;
2191
w:=w - m_smoother_width;
2192
s:=m_smoother_width;
2206
function line_profile_aa._profile_size;
2213
function line_profile_aa._subpixel_width;
2215
result:=m_subpixel_width;
2220
function line_profile_aa._min_width;
2222
result:=m_min_width;
2227
function line_profile_aa._smoother_width;
2229
result:=m_smoother_width;
2234
function line_profile_aa.value;
2238
ptrcomp(m_profile ) + (dist + subpixel_size * 2 ) * sizeof(int8u ) )^;
2243
function line_profile_aa.profile;
2248
m_subpixel_width:=trunc(w * subpixel_size );
2250
size:=m_subpixel_width + subpixel_size * 6;
2252
if size > m_size then
2254
agg_freemem(pointer(m_profile ) ,m_size * sizeof(int8u ) );
2255
agg_getmem (pointer(m_profile ) ,size * sizeof(int8u ) );
2266
procedure line_profile_aa.set_;
2268
base_val ,width ,k : double;
2270
subpixel_center_width ,subpixel_smoother_width ,i ,val ,n_smoother : unsigned;
2272
ch ,ch_center ,ch_smoother : int8u_ptr;
2277
if center_width = 0.0 then
2278
center_width:=1.0 / subpixel_size;
2280
if smoother_width = 0.0 then
2281
smoother_width:=1.0 / subpixel_size;
2283
width:=center_width + smoother_width;
2285
if width < m_min_width then
2287
k:=width / m_min_width;
2289
base_val :=base_val * k;
2290
center_width :=center_width / k;
2291
smoother_width:=smoother_width / k;
2295
ch:=profile(center_width + smoother_width );
2297
subpixel_center_width :=trunc(center_width * subpixel_size);
2298
subpixel_smoother_width:=trunc(smoother_width * subpixel_size);
2300
ch_center :=int8u_ptr(ptrcomp(ch ) + subpixel_size * 2 * sizeof(int8u ) );
2301
ch_smoother:=int8u_ptr(ptrcomp(ch_center ) + subpixel_center_width * sizeof(int8u ) );
2303
val:=m_gamma[trunc(base_val * aa_mask ) ];
2309
while i < subpixel_center_width do
2313
inc(ptrcomp(ch ) ,sizeof(int8u ) );
2320
while i < subpixel_smoother_width do
2325
(base_val - base_val * (i / subpixel_smoother_width ) ) * aa_mask ) ];
2327
inc(ptrcomp(ch_smoother ) ,sizeof(int8u ) );
2334
subpixel_smoother_width -
2335
subpixel_center_width -
2340
for i:=0 to n_smoother - 1 do
2342
ch_smoother^:=int8u(val );
2344
inc(ptrcomp(ch_smoother ) ,sizeof(int8u ) );
2350
for i:=0 to subpixel_size * 2 - 1 do
2354
dec(ptrcomp(ch ) ,sizeof(int8u ) );
2355
inc(ptrcomp(ch_center ) ,sizeof(int8u ) );
2362
constructor renderer_outline_aa.Construct;
2372
procedure renderer_outline_aa.color_;
2379
function renderer_outline_aa._color;
2386
procedure renderer_outline_aa.profile_;
2393
function renderer_outline_aa._profile;
2400
function renderer_outline_aa.subpixel_width;
2402
result:=m_profile._subpixel_width;
2407
function renderer_outline_aa.cover;
2409
result:=int8u(m_profile.value(d ) );
2413
{ BLEND_SOLID_HSPAN }
2414
procedure renderer_outline_aa.blend_solid_hspan;
2416
m_ren.blend_solid_hspan(x ,y ,len ,@m_color ,covers );
2420
{ BLEND_SOLID_VSPAN }
2421
procedure renderer_outline_aa.blend_solid_vspan;
2423
m_ren.blend_solid_vspan(x ,y ,len ,@m_color ,covers );
2427
{ ACCURATE_JOIN_ONLY }
2428
function renderer_outline_aa.accurate_join_only;
2435
procedure renderer_outline_aa.semidot_hline;
2437
covers : array[0..max_half_width * 2 + 4 - 1 ] of int8u;
2440
x ,y ,w ,x0 ,dx ,dy ,d : int;
2442
di : distance_interpolator0;
2448
x:=x1 shl line_subpixel_shift;
2449
y:=y1 shl line_subpixel_shift;
2452
di.Construct(xc1 ,yc1 ,xc2 ,yc2 ,x ,y );
2454
inc(x ,line_subpixel_size div 2 );
2455
inc(y ,line_subpixel_size div 2 );
2462
d:=trunc(fast_sqrt(dx * dx + dy * dy ) );
2466
if cmp(di.dist ) and
2468
p1^:=int8u(cover(d ) );
2470
inc(ptrcomp(p1 ) ,sizeof(int8u ) );
2471
inc(dx ,line_subpixel_size );
2479
m_ren.blend_solid_hspan(
2481
unsigned((ptrcomp(p1 ) - ptrcomp(p0 ) ) div sizeof(int8u ) ) ,
2487
procedure renderer_outline_aa.semidot;
2489
r ,dx ,dy ,dy0 ,dx0 ,x ,y : int;
2491
ei : ellipse_bresenham_interpolator;
2494
r:=shr_int32(subpixel_width + line_subpixel_mask ,line_subpixel_shift);
2499
ei.Construct(r ,r );
2505
x :=shr_int32(xc1 ,line_subpixel_shift );
2506
y :=shr_int32(yc1 ,line_subpixel_shift );
2514
semidot_hline(cmp ,xc1 ,yc1 ,xc2 ,yc2 ,x - dx0 ,y + dy0 ,x + dx0 );
2515
semidot_hline(cmp ,xc1 ,yc1 ,xc2 ,yc2 ,x - dx0 ,y - dy0 ,x + dx0 );
2526
semidot_hline(cmp ,xc1 ,yc1 ,xc2 ,yc2 ,x - dx0 ,y + dy0 ,x + dx0 );
2531
procedure renderer_outline_aa.line0;
2533
li : line_interpolator_aa0;
2536
li.Construct(@self ,lp );
2538
if li.count <> 0 then
2540
while li.step_ver do
2542
while li.step_hor do;
2547
procedure renderer_outline_aa.line1;
2549
li : line_interpolator_aa1;
2552
fix_degenerate_bisectrix_start(lp ,@sx ,@sy );
2554
li.Construct(@self ,lp ,sx ,sy );
2557
while li.step_ver do
2559
while li.step_hor do;
2564
procedure renderer_outline_aa.line2;
2566
li : line_interpolator_aa2;
2569
fix_degenerate_bisectrix_end(lp ,@ex ,@ey );
2571
li.Construct(@self ,lp ,ex ,ey );
2574
while li.step_ver do
2576
while li.step_hor do;
2581
procedure renderer_outline_aa.line3;
2583
li : line_interpolator_aa3;
2586
fix_degenerate_bisectrix_start(lp ,@sx ,@sy );
2587
fix_degenerate_bisectrix_end (lp ,@ex ,@ey );
2589
li.Construct(@self ,lp ,sx ,sy ,ex ,ey );
2592
while li.step_ver do
2594
while li.step_hor do;