Render one scanline of a stroke line using phase-based scanning.
Templated on Overwrite for compile-time dispatch (no per-pixel branch). AA uses precomputed shift+reciprocal — zero Coord multiplies.
405 {
406 PixelT* ptr = &buf[py * w + sc.
xmin];
407 fl::i32 cross = cross_start;
408 fl::i32 dot = dot_start;
411 const fl::i32 neg_thr = -thr;
412
413
414 while (px <= sc.
xmax && (cross >= thr || cross < neg_thr)) {
417 ++ptr; ++px;
418 }
419
420
421 fl::i32 py8 = static_cast<fl::i32>(py) << 8;
422 fl::i32 ey8_y0 = py8 - sc.
y0_8;
423 fl::i32 ey8_y1 = py8 - sc.
y1_8;
424
425
426 while (px <= sc.
xmax && cross < thr && cross >= neg_thr) {
427 fl::i32 abs_cross = (cross < 0) ? -cross : cross;
428 bool on_segment = (dot >= 0 && dot <= sc.
len2_q);
429
430 if (on_segment) {
431
432 fl::u16 shifted = static_cast<fl::u16>(
433 static_cast<fl::u32
>(abs_cross) >> sc.
aa_shift);
435
436 fl::u16 sq = static_cast<fl::u16>(linear_idx) * linear_idx;
437 fl::u8 sq_idx =
static_cast<fl::u8>((sq + 1 + (sq >> 8)) >> 8);
440 if (Overwrite) *ptr = c; else *ptr += c;
441 }
else if (sc.
cap == LineCap::ROUND) {
442
443 fl::i32 ex8;
444 fl::i16 ey_s;
445 if (dot < 0) {
446 ex8 = (
static_cast<fl::i32
>(px) << 8) - sc.
x0_8;
447 ey_s = static_cast<fl::i16>(ey8_y0);
448 } else {
449 ex8 = (
static_cast<fl::i32
>(px) << 8) - sc.
x1_8;
450 ey_s = static_cast<fl::i16>(ey8_y1);
451 }
452 fl::i16 ex_s = static_cast<fl::i16>(ex8);
453
454 fl::i32 ed2 = static_cast<fl::i32>(ex_s) * ex_s +
455 static_cast<fl::i32>(ey_s) * ey_s;
457 fl::u16 shifted = static_cast<fl::u16>(
458 static_cast<fl::u32
>(ed2) >> sc.
cap_shift);
462 if (Overwrite) *ptr = c; else *ptr += c;
463 }
464 }
else if (sc.
cap == LineCap::SQUARE) {
466 fl::u16 shifted = static_cast<fl::u16>(
467 static_cast<fl::u32
>(abs_cross) >> sc.
aa_shift);
469 fl::u16 sq = static_cast<fl::u16>(linear_idx) * linear_idx;
470 fl::u8 sq_idx =
static_cast<fl::u8>((sq + 1 + (sq >> 8)) >> 8);
473 if (Overwrite) *ptr = c; else *ptr += c;
474 }
475 }
476
477
480 ++ptr; ++px;
481 }
482
483}
#define FL_PGM_READ_BYTE_NEAR(x)
Read a byte (8-bit) from PROGMEM memory.
const fl::u8 distanceAA_LUT[256]
Distance antialiasing lookup table Maps normalized squared distance d²/r_max² (scaled 0....