2
// AggPas 2.4 RM3 Demo application
3
// Note: Press F1 key on run to see more info about this demo
5
// Paths: src;src\ctrl;src\svg;src\util;src\platform\win;expat-wrap
14
agg_platform_support ,
25
agg_rendering_buffer ,
27
agg_renderer_scanline ,
28
agg_rasterizer_scanline_aa ,
32
agg_render_scanlines ,
39
agg_span_interpolator_linear ,
40
agg_span_image_filter ,
41
agg_span_image_filter_rgb ,
51
filter_adaptor_ptr = ^filter_adaptor;
52
filter_adaptor = object
53
m_filter : image_filter_base_ptr;
55
constructor Construct(filter : image_filter_base_ptr );
58
function radius : double;
59
function calc_weight(x : double ) : double;
61
procedure set_radius(r : double );
65
the_application = object(platform_support )
66
m_radius : slider_ctrl;
82
m_blackman : cbox_ctrl;
84
m_filters : array[0..31 ] of cbox_ctrl_ptr;
101
m_filter_blackman : filter_adaptor;
103
m_filter_func : array[0..31 ] of filter_adaptor_ptr;
104
m_num_filters : unsigned;
106
constructor Construct(format_ : pix_format_e; flip_y_ : boolean );
109
procedure on_draw; virtual;
111
procedure on_key(x ,y : int; key ,flags : unsigned ); virtual;
116
constructor filter_adaptor.Construct;
123
destructor filter_adaptor.Destruct;
125
if m_filter <> NIL then
131
function filter_adaptor.radius;
133
if m_filter <> NIL then
134
result:=m_filter.radius
141
function filter_adaptor.calc_weight;
143
if m_filter <> NIL then
144
result:=m_filter.calc_weight(Abs(x ) )
151
procedure filter_adaptor.set_radius;
153
if m_filter <> NIL then
154
m_filter.set_radius(r );
159
constructor the_application.Construct;
164
inherited Construct(format_ ,flip_y_ );
166
m_radius.Construct (5.0 ,5.0 ,780 - 5 ,10.0 ,not flip_y_ );
167
m_bilinear.Construct(8.0 ,30.0 + 15 * 0 ,'bilinear' ,not flip_y_ );
168
m_bicubic.Construct (8.0 ,30.0 + 15 * 1 ,'bicubic ' ,not flip_y_ );
169
m_spline16.Construct(8.0 ,30.0 + 15 * 2 ,'spline16' ,not flip_y_ );
170
m_spline36.Construct(8.0 ,30.0 + 15 * 3 ,'spline36' ,not flip_y_ );
171
m_hanning.Construct (8.0 ,30.0 + 15 * 4 ,'hanning ' ,not flip_y_ );
172
m_hamming.Construct (8.0 ,30.0 + 15 * 5 ,'hamming ' ,not flip_y_ );
173
m_hermite.Construct (8.0 ,30.0 + 15 * 6 ,'hermite ' ,not flip_y_ );
174
m_kaiser.Construct (8.0 ,30.0 + 15 * 7 ,'kaiser ' ,not flip_y_ );
175
m_quadric.Construct (8.0 ,30.0 + 15 * 8 ,'quadric ' ,not flip_y_ );
176
m_catrom.Construct (8.0 ,30.0 + 15 * 9 ,'catrom ' ,not flip_y_ );
177
m_gaussian.Construct(8.0 ,30.0 + 15 * 10 ,'gaussian' ,not flip_y_ );
178
m_bessel.Construct (8.0 ,30.0 + 15 * 11 ,'bessel ' ,not flip_y_ );
179
m_mitchell.Construct(8.0 ,30.0 + 15 * 12 ,'mitchell' ,not flip_y_ );
180
m_sinc.Construct (8.0 ,30.0 + 15 * 13 ,'sinc ' ,not flip_y_ );
181
m_lanczos.Construct (8.0 ,30.0 + 15 * 14 ,'lanczos ' ,not flip_y_ );
182
m_blackman.Construct(8.0 ,30.0 + 15 * 15 ,'blackman' ,not flip_y_ );
184
m_filter_bilinear.Construct(new(image_filter_bilinear_ptr ,Construct ) );
185
m_filter_bicubic.Construct (new(image_filter_bicubic_ptr ,Construct ) );
186
m_filter_spline16.Construct(new(image_filter_spline16_ptr ,Construct ) );
187
m_filter_spline36.Construct(new(image_filter_spline36_ptr ,Construct ) );
188
m_filter_hanning.Construct (new(image_filter_hanning_ptr ,Construct ) );
189
m_filter_hamming.Construct (new(image_filter_hamming_ptr ,Construct ) );
190
m_filter_hermite.Construct (new(image_filter_hermite_ptr ,Construct ) );
191
m_filter_kaiser.Construct (new(image_filter_kaiser_ptr ,Construct ) );
192
m_filter_quadric.Construct (new(image_filter_quadric_ptr ,Construct ) );
193
m_filter_catrom.Construct (new(image_filter_catrom_ptr ,Construct ) );
194
m_filter_gaussian.Construct(new(image_filter_gaussian_ptr ,Construct ) );
195
m_filter_bessel.Construct (new(image_filter_bessel_ptr ,Construct ) );
196
m_filter_mitchell.Construct(new(image_filter_mitchell_ptr ,Construct ) );
197
m_filter_sinc.Construct (new(image_filter_sinc_ptr ,Construct(2.0 ) ) );
198
m_filter_lanczos.Construct (new(image_filter_lanczos_ptr ,Construct(2.0 ) ) );
199
m_filter_blackman.Construct(new(image_filter_blackman_ptr ,Construct(2.0 ) ) );
203
m_filters[m_num_filters ]:=@m_bilinear; inc(m_num_filters );
204
m_filters[m_num_filters ]:=@m_bicubic; inc(m_num_filters );
205
m_filters[m_num_filters ]:=@m_spline16; inc(m_num_filters );
206
m_filters[m_num_filters ]:=@m_spline36; inc(m_num_filters );
207
m_filters[m_num_filters ]:=@m_hanning; inc(m_num_filters );
208
m_filters[m_num_filters ]:=@m_hamming; inc(m_num_filters );
209
m_filters[m_num_filters ]:=@m_hermite; inc(m_num_filters );
210
m_filters[m_num_filters ]:=@m_kaiser; inc(m_num_filters );
211
m_filters[m_num_filters ]:=@m_quadric; inc(m_num_filters );
212
m_filters[m_num_filters ]:=@m_catrom; inc(m_num_filters );
213
m_filters[m_num_filters ]:=@m_gaussian; inc(m_num_filters );
214
m_filters[m_num_filters ]:=@m_bessel; inc(m_num_filters );
215
m_filters[m_num_filters ]:=@m_mitchell; inc(m_num_filters );
216
m_filters[m_num_filters ]:=@m_sinc; inc(m_num_filters );
217
m_filters[m_num_filters ]:=@m_lanczos; inc(m_num_filters );
218
m_filters[m_num_filters ]:=@m_blackman; inc(m_num_filters );
222
m_filter_func[i ]:=@m_filter_bilinear; inc(i );
223
m_filter_func[i ]:=@m_filter_bicubic; inc(i );
224
m_filter_func[i ]:=@m_filter_spline16; inc(i );
225
m_filter_func[i ]:=@m_filter_spline36; inc(i );
226
m_filter_func[i ]:=@m_filter_hanning; inc(i );
227
m_filter_func[i ]:=@m_filter_hamming; inc(i );
228
m_filter_func[i ]:=@m_filter_hermite; inc(i );
229
m_filter_func[i ]:=@m_filter_kaiser; inc(i );
230
m_filter_func[i ]:=@m_filter_quadric; inc(i );
231
m_filter_func[i ]:=@m_filter_catrom; inc(i );
232
m_filter_func[i ]:=@m_filter_gaussian; inc(i );
233
m_filter_func[i ]:=@m_filter_bessel; inc(i );
234
m_filter_func[i ]:=@m_filter_mitchell; inc(i );
235
m_filter_func[i ]:=@m_filter_sinc; inc(i );
236
m_filter_func[i ]:=@m_filter_lanczos; inc(i );
237
m_filter_func[i ]:=@m_filter_blackman; inc(i );
239
for i:=0 to m_num_filters - 1 do
240
add_ctrl(m_filters[i ] );
242
m_radius.range_(2.0 ,8.0 );
243
m_radius.value_(4.0 );
244
m_radius.label_('Radius=%.3f' );
246
add_ctrl(@m_radius );
251
destructor the_application.Destruct;
273
m_filter_bilinear.Destruct;
274
m_filter_bicubic.Destruct;
275
m_filter_spline16.Destruct;
276
m_filter_spline36.Destruct;
277
m_filter_hanning.Destruct;
278
m_filter_hamming.Destruct;
279
m_filter_hermite.Destruct;
280
m_filter_kaiser.Destruct;
281
m_filter_quadric.Destruct;
282
m_filter_catrom.Destruct;
283
m_filter_gaussian.Destruct;
284
m_filter_bessel.Destruct;
285
m_filter_mitchell.Destruct;
286
m_filter_sinc.Destruct;
287
m_filter_lanczos.Destruct;
288
m_filter_blackman.Destruct;
293
procedure the_application.on_draw;
295
pixf : pixel_formats;
299
rs : renderer_scanline_aa_solid;
302
ras : rasterizer_scanline_aa;
304
normalized : image_filter_lut;
307
x_start ,x_end ,y_start ,y_end ,x_center ,x ,y ,ys ,radius ,dy ,xs ,dx ,sum ,xf : double;
311
i ,j ,n ,xint ,nn : unsigned;
318
// Initialize structures
319
pixfmt_bgr24(pixf ,rbuf_window );
321
rb.Construct(@pixf );
324
rgba.ConstrDbl(1.0 ,1.0 ,1.0 );
332
x_end :=_initial_width - 15.0;
334
y_end :=_initial_height - 10.0;
335
x_center:=(x_start + x_end ) / 2;
339
tr.Construct(@pl ,_trans_affine_resizing );
343
x:=x_start + (x_end - x_start ) * i / 16.0;
346
p.move_to(x + 0.5 ,y_start );
347
p.line_to(x + 0.5 ,y_end );
352
rgba.ConstrInt(0 ,0 ,0 ,255 )
354
rgba.ConstrInt(0 ,0 ,0 ,100 );
357
render_scanlines(@ras ,@sl ,@rs );
361
ys:=y_start + (y_end - y_start ) / 6.0;
364
p.move_to (x_start ,ys );
365
p.line_to (x_end ,ys );
367
rgba.ConstrInt (0 ,0 ,0 );
369
render_scanlines(@ras ,@sl ,@rs );
373
for i:=0 to m_num_filters - 1 do
374
if m_filters[i ]._status then
376
m_filter_func[i ].set_radius(m_radius._value );
378
radius:=m_filter_func[i ].radius;
380
n :=trunc(radius * 256 * 2 );
383
xs:=(x_end + x_start ) / 2.0 - (radius * (x_end - x_start ) / 16.0 );
384
dx:=(x_end - x_start ) * radius / 8.0;
387
p.move_to(xs + 0.5 ,ys + dy * m_filter_func[i ].calc_weight(-radius ) );
394
xs + dx * j / n + 0.5 ,
395
ys + dy * m_filter_func[i ].calc_weight(j / 256.0 - radius ) );
402
rgba.ConstrInt (100 ,0 ,0 );
404
render_scanlines(@ras ,@sl ,@rs );
408
ir:=trunc(Ceil(radius ) + 0.1 );
410
for xint:=0 to 255 do
418
xf:=xint / 256.0 + xfract;
420
if (xf >= -radius ) or
422
sum:=sum + m_filter_func[i ].calc_weight(xf );
428
x:=x_center + ((-128.0 + xint ) / 128.0 ) * radius * (x_end - x_start ) / 16.0;
429
y:=ys + sum * 256 - 256;
439
rgba.ConstrInt (0 ,100 ,0 );
441
render_scanlines(@ras ,@sl ,@rs );
443
normalized.Construct(m_filter_func[i ].m_filter );
445
weights:=normalized.weight_array;
447
xs:=(x_end + x_start ) / 2.0 - (normalized.diameter * (x_end - x_start ) / 32.0 );
448
nn:=normalized.diameter * 256;
451
p.move_to(xs + 0.5 ,ys + dy * int16_ptr(weights )^ / image_filter_size );
458
xs + dx * j / n + 0.5 ,
459
ys + dy * int16_ptr(ptrcomp(weights ) + j * sizeof(int16 ) )^ / image_filter_size );
466
rgba.ConstrInt (0 ,0 ,100 ,255 );
468
render_scanlines(@ras ,@sl ,@rs );
475
// Render the controls
476
for i:=0 to m_num_filters - 1 do
477
render_ctrl(@ras ,@sl ,@rs ,m_filters[i ] );
481
m_blackman._status then
482
render_ctrl(@ras ,@sl ,@rs ,@m_radius );
484
// Free AGG resources
494
procedure the_application.on_key;
498
'Demonstration of the shapes of different interpolation filters. '#13 +
499
'Just in case if you are curious.' +
500
#13#13'Note: F2 key saves current "screenshot" file in this demo''s directory. ' );
505
app : the_application;
508
app.Construct(pix_format_bgr24 ,flip_y );
509
app.caption_ ('Image filters'' shape comparison (F1-Help)' );
511
if app.init(780 ,300 ,window_resize ) then
b'\\ No newline at end of file'