15 #ifndef AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED 16 #define AGG_SPAN_INTERPOLATOR_PERSP_INCLUDED 19 #include "agg_trans_perspective.h" 20 #include "agg_dda_line.h" 28 template<
unsigned SubpixelShift = 8>
36 subpixel_shift = SubpixelShift,
37 subpixel_scale = 1 << subpixel_shift
47 quad_to_quad(src, dst);
56 rect_to_quad(x1, y1, x2, y2, quad);
65 quad_to_rect(quad, x1, y1, x2, y2);
70 void quad_to_quad(
const double* src,
const double* dst)
72 m_trans_dir.quad_to_quad(src, dst);
73 m_trans_inv.quad_to_quad(dst, src);
78 void rect_to_quad(
double x1,
double y1,
double x2,
double y2,
86 quad_to_quad(src, quad);
92 void quad_to_rect(
const double* quad,
93 double x1,
double y1,
double x2,
double y2)
100 quad_to_quad(quad, dst);
105 bool is_valid()
const {
return m_trans_dir.is_valid(); }
108 void begin(
double x,
double y,
unsigned len)
110 m_iterator = m_trans_dir.begin(x, y, 1.0);
111 double xt = m_iterator.x;
112 double yt = m_iterator.y;
116 const double delta = 1/double(subpixel_scale);
119 m_trans_inv.transform(&dx, &dy);
122 int sx1 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
125 m_trans_inv.transform(&dx, &dy);
128 int sy1 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
133 m_trans_dir.transform(&xt, &yt);
137 m_trans_inv.transform(&dx, &dy);
140 int sx2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
143 m_trans_inv.transform(&dx, &dy);
146 int sy2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
154 void resynchronize(
double xe,
double ye,
unsigned len)
157 int sx1 = m_scale_x.y();
158 int sy1 = m_scale_y.y();
163 m_trans_dir.transform(&xt, &yt);
165 const double delta = 1/double(subpixel_scale);
172 m_trans_inv.transform(&dx, &dy);
175 int sx2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
180 m_trans_inv.transform(&dx, &dy);
183 int sy2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
201 void coordinates(
int* x,
int* y)
const 203 *x = iround(m_iterator.x * subpixel_scale);
204 *y = iround(m_iterator.y * subpixel_scale);
208 void local_scale(
int* x,
int* y)
215 void transform(
double* x,
double* y)
const 217 m_trans_dir.transform(x, y);
221 trans_type m_trans_dir;
222 trans_type m_trans_inv;
223 iterator_type m_iterator;
239 template<
unsigned SubpixelShift = 8>
244 enum subpixel_scale_e
246 subpixel_shift = SubpixelShift,
247 subpixel_scale = 1 << subpixel_shift
257 quad_to_quad(src, dst);
263 double x2,
double y2,
266 rect_to_quad(x1, y1, x2, y2, quad);
272 double x1,
double y1,
273 double x2,
double y2)
275 quad_to_rect(quad, x1, y1, x2, y2);
280 void quad_to_quad(
const double* src,
const double* dst)
282 m_trans_dir.quad_to_quad(src, dst);
283 m_trans_inv.quad_to_quad(dst, src);
288 void rect_to_quad(
double x1,
double y1,
double x2,
double y2,
292 src[0] = src[6] = x1;
293 src[2] = src[4] = x2;
294 src[1] = src[3] = y1;
295 src[5] = src[7] = y2;
296 quad_to_quad(src, quad);
302 void quad_to_rect(
const double* quad,
303 double x1,
double y1,
double x2,
double y2)
306 dst[0] = dst[6] = x1;
307 dst[2] = dst[4] = x2;
308 dst[1] = dst[3] = y1;
309 dst[5] = dst[7] = y2;
310 quad_to_quad(quad, dst);
315 bool is_valid()
const {
return m_trans_dir.is_valid(); }
318 void begin(
double x,
double y,
unsigned len)
323 m_trans_dir.transform(&xt, &yt);
324 int x1 = iround(xt * subpixel_scale);
325 int y1 = iround(yt * subpixel_scale);
329 const double delta = 1/double(subpixel_scale);
334 m_trans_inv.transform(&dx, &dy);
337 int sx1 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
342 m_trans_inv.transform(&dx, &dy);
345 int sy1 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
351 m_trans_dir.transform(&xt, &yt);
352 int x2 = iround(xt * subpixel_scale);
353 int y2 = iround(yt * subpixel_scale);
358 m_trans_inv.transform(&dx, &dy);
361 int sx2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
366 m_trans_inv.transform(&dx, &dy);
369 int sy2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
380 void resynchronize(
double xe,
double ye,
unsigned len)
383 int x1 = m_coord_x.y();
384 int y1 = m_coord_y.y();
385 int sx1 = m_scale_x.y();
386 int sy1 = m_scale_y.y();
391 m_trans_dir.transform(&xt, &yt);
392 int x2 = iround(xt * subpixel_scale);
393 int y2 = iround(yt * subpixel_scale);
395 const double delta = 1/double(subpixel_scale);
402 m_trans_inv.transform(&dx, &dy);
405 int sx2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
410 m_trans_inv.transform(&dx, &dy);
413 int sy2 = uround(subpixel_scale/std::sqrt(dx*dx + dy*dy)) >> subpixel_shift;
433 void coordinates(
int* x,
int* y)
const 440 void local_scale(
int* x,
int* y)
447 void transform(
double* x,
double* y)
const 449 m_trans_dir.transform(x, y);
453 trans_type m_trans_dir;
454 trans_type m_trans_inv;