| 227 | //---------------------------------------------------------------------------- |
| 228 | template<class Renderer, class Coord> |
| 229 | void rasterizer_outline_aa<Renderer, Coord>::draw(draw_vars& dv, |
| 230 | unsigned start, |
| 231 | unsigned end) |
| 232 | { |
| 233 | unsigned i; |
| 234 | const vertex_storage_type::value_type* v; |
| 235 | |
| 236 | for(i = start; i < end; i++) |
| 237 | { |
| 238 | if(m_line_join == outline_round_join) |
| 239 | { |
| 240 | dv.xb1 = dv.curr.x1 + (dv.curr.y2 - dv.curr.y1); |
| 241 | dv.yb1 = dv.curr.y1 - (dv.curr.x2 - dv.curr.x1); |
| 242 | dv.xb2 = dv.curr.x2 + (dv.curr.y2 - dv.curr.y1); |
| 243 | dv.yb2 = dv.curr.y2 - (dv.curr.x2 - dv.curr.x1); |
| 244 | } |
| 245 | |
| 246 | switch(dv.flags) |
| 247 | { |
| 248 | case 0: m_ren->line3(dv.curr, dv.xb1, dv.yb1, dv.xb2, dv.yb2); break; |
| 249 | case 1: m_ren->line2(dv.curr, dv.xb2, dv.yb2); break; |
| 250 | case 2: m_ren->line1(dv.curr, dv.xb1, dv.yb1); break; |
| 251 | case 3: m_ren->line0(dv.curr); break; |
| 252 | } |
| 253 | |
| 254 | if(m_line_join == outline_round_join && (dv.flags & 2) == 0) |
| 255 | { |
| 256 | m_ren->pie(dv.curr.x2, dv.curr.y2, |
| 257 | dv.curr.x2 + (dv.curr.y2 - dv.curr.y1), |
| 258 | dv.curr.y2 - (dv.curr.x2 - dv.curr.x1), |
| 259 | dv.curr.x2 + (dv.next.y2 - dv.next.y1), |
| 260 | dv.curr.y2 - (dv.next.x2 - dv.next.x1)); |
| 261 | } |
| 262 | |
| 263 | dv.x1 = dv.x2; |
| 264 | dv.y1 = dv.y2; |
| 265 | dv.lcurr = dv.lnext; |
| 266 | dv.lnext = m_src_vertices[dv.idx].len; |
| 267 | |
| 268 | ++dv.idx; |
| 269 | if(dv.idx >= m_src_vertices.size()) dv.idx = 0; |
| 270 | |
| 271 | v = &m_src_vertices[dv.idx]; |
| 272 | dv.x2 = v->x; |
| 273 | dv.y2 = v->y; |
| 274 | |
| 275 | dv.curr = dv.next; |
| 276 | dv.next = line_parameters(dv.x1, dv.y1, dv.x2, dv.y2, dv.lnext); |
| 277 | dv.xb1 = dv.xb2; |
| 278 | dv.yb1 = dv.yb2; |
| 279 | |
| 280 | switch(m_line_join) |
| 281 | { |
| 282 | case outline_no_join: |
| 283 | dv.flags = 3; |
| 284 | break; |
| 285 | |
| 286 | case outline_miter_join: |