15 #ifndef AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED 16 #define AGG_SPAN_SUBDIV_ADAPTOR_INCLUDED 18 #include "agg_basics.h" 24 template<
class Interpolator,
unsigned SubpixelShift = 8>
28 typedef Interpolator interpolator_type;
29 typedef typename interpolator_type::trans_type trans_type;
33 subpixel_shift = SubpixelShift,
34 subpixel_scale = 1 << subpixel_shift
41 m_subdiv_size(1 << m_subdiv_shift),
42 m_subdiv_mask(m_subdiv_size - 1) {}
45 unsigned subdiv_shift = 4) :
46 m_subdiv_shift(subdiv_shift),
47 m_subdiv_size(1 << m_subdiv_shift),
48 m_subdiv_mask(m_subdiv_size - 1),
49 m_interpolator(&interpolator) {}
52 double x,
double y,
unsigned len,
53 unsigned subdiv_shift = 4) :
54 m_subdiv_shift(subdiv_shift),
55 m_subdiv_size(1 << m_subdiv_shift),
56 m_subdiv_mask(m_subdiv_size - 1),
57 m_interpolator(&interpolator)
64 const interpolator_type& interpolator()
const {
return *m_interpolator; }
65 void interpolator(interpolator_type& intr) { m_interpolator = &intr; }
68 const trans_type& transformer()
const 70 return *m_interpolator->transformer();
72 void transformer(
const trans_type& trans)
74 m_interpolator->transformer(trans);
78 unsigned subdiv_shift()
const {
return m_subdiv_shift; }
79 void subdiv_shift(
unsigned shift)
81 m_subdiv_shift = shift;
82 m_subdiv_size = 1 << m_subdiv_shift;
83 m_subdiv_mask = m_subdiv_size - 1;
87 void begin(
double x,
double y,
unsigned len)
90 m_src_x = iround(x * subpixel_scale) + subpixel_scale;
93 if(len > m_subdiv_size) len = m_subdiv_size;
94 m_interpolator->begin(x, y, len);
101 if(m_pos >= m_subdiv_size)
103 unsigned len = m_len;
104 if(len > m_subdiv_size) len = m_subdiv_size;
105 m_interpolator->resynchronize(
double(m_src_x) /
double(subpixel_scale) + len,
110 m_src_x += subpixel_scale;
116 void coordinates(
int* x,
int* y)
const 118 m_interpolator->coordinates(x, y);
122 void local_scale(
int* x,
int* y)
const 124 m_interpolator->local_scale(x, y);
129 unsigned m_subdiv_shift;
130 unsigned m_subdiv_size;
131 unsigned m_subdiv_mask;
132 interpolator_type* m_interpolator;