24 #ifndef AGG_SPAN_GOURAUD_GRAY_INCLUDED 25 #define AGG_SPAN_GOURAUD_GRAY_INCLUDED 29 #include "agg_basics.h" 30 #include "agg_color_gray.h" 31 #include "agg_dda_line.h" 32 #include "agg_span_gouraud.h" 41 typedef ColorT color_type;
42 typedef typename color_type::value_type value_type;
48 subpixel_scale = 1 << subpixel_shift
55 void init(
const coord_type& c1,
const coord_type& c2)
60 double dy = c2.y - c1.y;
61 m_1dy = (std::fabs(dy) < 1e-10) ? 1e10 : 1.0 / dy;
64 m_dv = c2.color.v - m_v1;
65 m_da = c2.color.a - m_a1;
70 double k = (y - m_y1) * m_1dy;
73 m_v = m_v1 + iround(m_dv * k);
74 m_a = m_a1 + iround(m_da * k);
75 m_x = iround((m_x1 + m_dx * k) * subpixel_scale);
100 double x3,
double y3,
102 base_type(c1, c2, c3, x1, y1, x2, y2, x3, y3, d)
109 base_type::arrange_vertices(coord);
111 m_y2 = int(coord[1].y);
113 m_swap = cross_product(coord[0].x, coord[0].y,
114 coord[2].x, coord[2].y,
115 coord[1].x, coord[1].y) < 0.0;
117 m_c1.init(coord[0], coord[2]);
118 m_c2.init(coord[0], coord[1]);
119 m_c3.init(coord[1], coord[2]);
123 void generate(color_type* span,
int x,
int y,
unsigned len)
126 const gray_calc* pc1 = &m_c1;
127 const gray_calc* pc2 = &m_c2;
133 m_c2.calc(y + m_c2.m_1dy);
139 m_c3.calc(y - m_c3.m_1dy);
148 const gray_calc* t = pc2;
156 int nlen = std::abs(pc2->m_x - pc1->m_x);
157 if(nlen <= 0) nlen = 1;
167 int start = pc1->m_x - (x << subpixel_shift);
173 enum lim_e { lim = color_type::base_mask };
181 while(len && start > 0)
185 if(vv < 0) vv = 0;
if(vv > lim) vv = lim;
186 if(va < 0) va = 0;
if(va > lim) va = lim;
187 span->v = (value_type)vv;
188 span->a = (value_type)va;
191 nlen -= subpixel_scale;
192 start -= subpixel_scale;
202 while(len && nlen > 0)
204 span->v = (value_type)v.y();
205 span->a = (value_type)a.y();
208 nlen -= subpixel_scale;
220 if(vv < 0) vv = 0;
if(vv > lim) vv = lim;
221 if(va < 0) va = 0;
if(va > lim) va = lim;
222 span->v = (value_type)vv;
223 span->a = (value_type)va;