Render one scanline of a ring using incremental d² with phase-based scanning.
Templated on Overwrite for compile-time dispatch (no per-pixel branch). Zones (left to right): outside → outer-AA → solid → inner-AA → hole → inner-AA → solid → outer-AA → outside.
Definition at line 319 of file primitives.h.
321 {
322 PixelT* ptr = &buf[py * w +
g.xmin];
323 fl::i32 d2 = d2_row;
324 fl::i32 xd =
g.xdelta0;
326
327 while (px <= g.xmax && d2 >=
g.oo2) {
328 d2 += xd; xd += 131072; ++ptr; ++px;
329 }
330
331 while (px <= g.xmax && d2 >=
g.oi2 && d2 <
g.oo2) {
332 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(
g.oo2 - d2) >>
g.outer_shift);
334 PixelT c =
g.color; c.nscale8(br);
335 if (Overwrite) *ptr = c; else *ptr += c;
336 d2 += xd; xd += 131072; ++ptr; ++px;
337 }
338
339 while (px <= g.xmax && d2 >=
g.io2 && d2 <
g.oi2) {
340 if (Overwrite) *ptr =
g.color;
else *ptr +=
g.color;
341 d2 += xd; xd += 131072; ++ptr; ++px;
342 }
343
344 while (px <= g.xmax && d2 >=
g.ii2 && d2 <
g.io2) {
345 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(d2 -
g.ii2) >>
g.inner_shift);
347 PixelT c =
g.color; c.nscale8(br);
348 if (Overwrite) *ptr = c; else *ptr += c;
349 d2 += xd; xd += 131072; ++ptr; ++px;
350 }
351
352 while (px <=
g.xmax && d2 <
g.ii2) {
353 d2 += xd; xd += 131072; ++ptr; ++px;
354 }
355
356 while (px <= g.xmax && d2 >=
g.ii2 && d2 <
g.io2) {
357 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(d2 -
g.ii2) >>
g.inner_shift);
359 PixelT c =
g.color; c.nscale8(br);
360 if (Overwrite) *ptr = c; else *ptr += c;
361 d2 += xd; xd += 131072; ++ptr; ++px;
362 }
363
364 while (px <= g.xmax && d2 >=
g.io2 && d2 <
g.oi2) {
365 if (Overwrite) *ptr =
g.color;
else *ptr +=
g.color;
366 d2 += xd; xd += 131072; ++ptr; ++px;
367 }
368
369 while (px <= g.xmax && d2 >=
g.oi2 && d2 <
g.oo2) {
370 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(
g.oo2 - d2) >>
g.outer_shift);
372 PixelT c =
g.color; c.nscale8(br);
373 if (Overwrite) *ptr = c; else *ptr += c;
374 d2 += xd; xd += 131072; ++ptr; ++px;
375 }
376}
References fl::FL_NO_EXCEPT, fl::g, and renderRingRow().
Referenced by drawRingCore(), and renderRingRow().