16 #ifndef AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED 17 #define AGG_SPAN_INTERPOLATOR_LINEAR_INCLUDED 19 #include "agg_basics.h" 20 #include "agg_dda_line.h" 21 #include "agg_trans_affine.h" 27 template<
class Transformer = trans_affine,
unsigned SubpixelShift = 8>
31 typedef Transformer trans_type;
35 subpixel_shift = SubpixelShift,
36 subpixel_scale = 1 << subpixel_shift
43 double x,
double y,
unsigned len) :
50 const trans_type& transformer()
const {
return *m_trans; }
51 void transformer(trans_type& trans) { m_trans = &trans; }
54 void begin(
double x,
double y,
unsigned len)
61 m_trans->transform(&tx, &ty);
62 int x1 = iround(tx * subpixel_scale);
63 int y1 = iround(ty * subpixel_scale);
67 m_trans->transform(&tx, &ty);
68 int x2 = iround(tx * subpixel_scale);
69 int y2 = iround(ty * subpixel_scale);
76 void resynchronize(
double xe,
double ye,
unsigned len)
78 m_trans->transform(&xe, &ye);
91 void coordinates(
int* x,
int* y)
const 109 template<
class Transformer = trans_affine,
unsigned SubpixelShift = 8>
113 typedef Transformer trans_type;
115 enum subpixel_scale_e
117 subpixel_shift = SubpixelShift,
118 subpixel_scale = 1 << subpixel_shift
125 m_subdiv_size(1 << m_subdiv_shift),
126 m_subdiv_mask(m_subdiv_size - 1) {}
129 unsigned subdiv_shift = 4) :
130 m_subdiv_shift(subdiv_shift),
131 m_subdiv_size(1 << m_subdiv_shift),
132 m_subdiv_mask(m_subdiv_size - 1),
136 double x,
double y,
unsigned len,
137 unsigned subdiv_shift = 4) :
138 m_subdiv_shift(subdiv_shift),
139 m_subdiv_size(1 << m_subdiv_shift),
140 m_subdiv_mask(m_subdiv_size - 1),
147 const trans_type& transformer()
const {
return *m_trans; }
148 void transformer(
const trans_type& trans) { m_trans = &trans; }
151 unsigned subdiv_shift()
const {
return m_subdiv_shift; }
152 void subdiv_shift(
unsigned shift)
154 m_subdiv_shift = shift;
155 m_subdiv_size = 1 << m_subdiv_shift;
156 m_subdiv_mask = m_subdiv_size - 1;
160 void begin(
double x,
double y,
unsigned len)
165 m_src_x = iround(x * subpixel_scale) + subpixel_scale;
169 if(len > m_subdiv_size) len = m_subdiv_size;
172 m_trans->transform(&tx, &ty);
173 int x1 = iround(tx * subpixel_scale);
174 int y1 = iround(ty * subpixel_scale);
178 m_trans->transform(&tx, &ty);
189 if(m_pos >= m_subdiv_size)
191 unsigned len = m_len;
192 if(len > m_subdiv_size) len = m_subdiv_size;
193 double tx = double(m_src_x) / double(subpixel_scale) + len;
195 m_trans->transform(&tx, &ty);
200 m_src_x += subpixel_scale;
206 void coordinates(
int* x,
int* y)
const 213 unsigned m_subdiv_shift;
214 unsigned m_subdiv_size;
215 unsigned m_subdiv_mask;