19 #ifndef AGG_SPAN_IMAGE_FILTER_INCLUDED 20 #define AGG_SPAN_IMAGE_FILTER_INCLUDED 22 #include "agg_basics.h" 23 #include "agg_image_filters.h" 24 #include "agg_span_interpolator_linear.h" 33 typedef Source source_type;
34 typedef Interpolator interpolator_type;
39 interpolator_type& interpolator,
42 m_interpolator(&interpolator),
46 m_dx_int(image_subpixel_scale / 2),
47 m_dy_int(image_subpixel_scale / 2)
49 void attach(source_type& v) { m_src = &v; }
52 source_type& source() {
return *m_src; }
53 const source_type& source()
const {
return *m_src; }
55 int filter_dx_int()
const {
return m_dx_int; }
56 int filter_dy_int()
const {
return m_dy_int; }
57 double filter_dx_dbl()
const {
return m_dx_dbl; }
58 double filter_dy_dbl()
const {
return m_dy_dbl; }
61 void interpolator(interpolator_type& v) { m_interpolator = &v; }
63 void filter_offset(
double dx,
double dy)
67 m_dx_int = iround(dx * image_subpixel_scale);
68 m_dy_int = iround(dy * image_subpixel_scale);
70 void filter_offset(
double d) { filter_offset(d, d); }
73 interpolator_type& interpolator() {
return *m_interpolator; }
81 interpolator_type* m_interpolator;
93 template<
class Source>
98 typedef Source source_type;
104 m_scale_limit(200.0),
111 interpolator_type& inter,
113 base_type(src, inter, &filter),
114 m_scale_limit(200.0),
121 int scale_limit()
const {
return uround(m_scale_limit); }
122 void scale_limit(
int v) { m_scale_limit = v; }
125 double blur_x()
const {
return m_blur_x; }
126 double blur_y()
const {
return m_blur_y; }
127 void blur_x(
double v) { m_blur_x = v; }
128 void blur_y(
double v) { m_blur_y = v; }
129 void blur(
double v) { m_blur_x = m_blur_y = v; }
137 base_type::interpolator().transformer().scaling_abs(&scale_x, &scale_y);
139 double scale_xy = scale_x * scale_y;
140 if (scale_xy > m_scale_limit)
142 scale_x = scale_x * m_scale_limit / scale_xy;
143 scale_y = scale_y * m_scale_limit / scale_xy;
146 if(scale_x < 1) scale_x = 1;
147 if(scale_y < 1) scale_y = 1;
149 if(scale_x > m_scale_limit) scale_x = m_scale_limit;
150 if(scale_y > m_scale_limit) scale_y = m_scale_limit;
155 if(scale_x < 1) scale_x = 1;
156 if(scale_y < 1) scale_y = 1;
158 m_rx = uround( scale_x *
double(image_subpixel_scale));
159 m_rx_inv = uround(1.0/scale_x *
double(image_subpixel_scale));
161 m_ry = uround( scale_y *
double(image_subpixel_scale));
162 m_ry_inv = uround(1.0/scale_y *
double(image_subpixel_scale));
172 double m_scale_limit;
180 template<
class Source,
class Interpolator>
185 typedef Source source_type;
186 typedef Interpolator interpolator_type;
192 m_blur_x(image_subpixel_scale),
193 m_blur_y(image_subpixel_scale)
198 interpolator_type& inter,
200 base_type(src, inter, &filter),
202 m_blur_x(image_subpixel_scale),
203 m_blur_y(image_subpixel_scale)
207 int scale_limit()
const {
return m_scale_limit; }
208 void scale_limit(
int v) { m_scale_limit = v; }
211 double blur_x()
const {
return double(m_blur_x) / double(image_subpixel_scale); }
212 double blur_y()
const {
return double(m_blur_y) / double(image_subpixel_scale); }
213 void blur_x(
double v) { m_blur_x = uround(v *
double(image_subpixel_scale)); }
214 void blur_y(
double v) { m_blur_y = uround(v *
double(image_subpixel_scale)); }
215 void blur(
double v) { m_blur_x =
216 m_blur_y = uround(v *
double(image_subpixel_scale)); }
219 AGG_INLINE
void adjust_scale(
int* rx,
int* ry)
221 if(*rx < image_subpixel_scale) *rx = image_subpixel_scale;
222 if(*ry < image_subpixel_scale) *ry = image_subpixel_scale;
223 if(*rx > image_subpixel_scale * m_scale_limit)
225 *rx = image_subpixel_scale * m_scale_limit;
227 if(*ry > image_subpixel_scale * m_scale_limit)
229 *ry = image_subpixel_scale * m_scale_limit;
231 *rx = (*rx * m_blur_x) >> image_subpixel_shift;
232 *ry = (*ry * m_blur_y) >> image_subpixel_shift;
233 if(*rx < image_subpixel_scale) *rx = image_subpixel_scale;
234 if(*ry < image_subpixel_scale) *ry = image_subpixel_scale;