27 return (
fl::u8)
fl::clamp((alpha * T(255.0f) + T(0.5f)).to_int(), 0, 255);
53 return (
fl::u8)
fl::clamp((alpha * c255 + half).to_int(), (fl::i32)0, (fl::i32)255);
105 return static_cast<int>(val);
117 return static_cast<int>(val);
123template<
typename PixelT,
bool Overwrite>
141template<
typename Coord,
typename =
void>
145template<
typename Coord>
151template<
typename Coord>
153 return num * inv_denom;
157template<
typename Coord>
167template<
typename Coord>
181template<
typename Coord>
183 return static_cast<fl::i32
>(val.to_float() * 256.0f);
188 return static_cast<fl::i32
>(val * 256.0f);
193 return static_cast<fl::i32
>(val * 256.0);
198 return static_cast<fl::i32
>(
static_cast<fl::u32
>(val) << 8);
204 return static_cast<fl::i32
>(val.raw() >> 8);
213 fl::u32 tmp =
static_cast<fl::u32
>(band);
214 while (tmp > 255u) { tmp >>= 1; ++sh; }
218 inv_out =
static_cast<fl::u16
>((65280u + (scaled >> 1)) / scaled);
224template<
typename Coord>
226 return static_cast<fl::i32
>(val.to_float() * 65536.0f);
231 return static_cast<fl::i32
>(val * 65536.0f);
236 return static_cast<fl::i32
>(val * 65536.0);
241 return static_cast<fl::i32
>(val) << 16;
253template<
typename PixelT>
266template<
typename PixelT>
279template<
typename PixelT,
bool Overwrite>
283 PixelT* ptr = &buf[py * w + f.xmin];
285 fl::i32 xd = f.xdelta0;
288 while (px <= f.xmax && d2 >= f.rout2) {
289 d2 += xd; xd += 131072; ++ptr; ++px;
292 while (px <= f.xmax && d2 >= f.rin2 && d2 < f.rout2) {
293 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(f.rout2 - d2) >> f.band_shift);
294 fl::u8 br =
static_cast<fl::u8>((diff * f.band_inv) >> 8);
295 PixelT c = f.color; c.nscale8(br);
296 if (Overwrite) *ptr = c;
else *ptr += c;
297 d2 += xd; xd += 131072; ++ptr; ++px;
300 while (px <= f.xmax && d2 < f.rin2) {
301 if (Overwrite) *ptr = f.color;
else *ptr += f.color;
302 d2 += xd; xd += 131072; ++ptr; ++px;
305 while (px <= f.xmax && d2 < f.rout2) {
306 fl::u16 diff =
static_cast<fl::u16
>(
static_cast<fl::u32
>(f.rout2 - d2) >> f.band_shift);
307 fl::u8 br =
static_cast<fl::u8>((diff * f.band_inv) >> 8);
308 PixelT c = f.color; c.nscale8(br);
309 if (Overwrite) *ptr = c;
else *ptr += c;
310 d2 += xd; xd += 131072; ++ptr; ++px;
318template<
typename PixelT,
bool Overwrite>
322 PixelT* ptr = &buf[py * w +
g.xmin];
324 fl::i32 xd =
g.xdelta0;
327 while (px <= g.xmax && d2 >=
g.oo2) {
328 d2 += xd; xd += 131072; ++ptr; ++px;
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;
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;
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;
352 while (px <=
g.xmax && d2 <
g.ii2) {
353 d2 += xd; xd += 131072; ++ptr; ++px;
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;
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;
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;
382template<
typename PixelT>
402template<
typename PixelT,
bool Overwrite>
404 fl::i32 cross_start, fl::i32 dot_start,
406 PixelT* ptr = &buf[py * w + sc.xmin];
407 fl::i32 cross = cross_start;
408 fl::i32 dot = dot_start;
410 const fl::i32 thr = sc.threshold_q;
411 const fl::i32 neg_thr = -thr;
414 while (px <= sc.xmax && (cross >= thr || cross < neg_thr)) {
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;
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);
432 fl::u16 shifted =
static_cast<fl::u16
>(
433 static_cast<fl::u32
>(abs_cross) >> sc.aa_shift);
434 fl::u8 linear_idx =
static_cast<fl::u8>((shifted * sc.aa_inv) >> 8);
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) {
446 ex8 = (
static_cast<fl::i32
>(px) << 8) - sc.x0_8;
447 ey_s =
static_cast<fl::i16
>(ey8_y0);
449 ex8 = (
static_cast<fl::i32
>(px) << 8) - sc.x1_8;
450 ey_s =
static_cast<fl::i16
>(ey8_y1);
452 fl::i16 ex_s =
static_cast<fl::i16
>(ex8);
454 fl::i32 ed2 =
static_cast<fl::i32
>(ex_s) * ex_s +
455 static_cast<fl::i32
>(ey_s) * ey_s;
456 if (ed2 < sc.r_max2_8) {
457 fl::u16 shifted =
static_cast<fl::u16
>(
458 static_cast<fl::u32
>(ed2) >> sc.cap_shift);
459 fl::u8 idx =
static_cast<fl::u8>((shifted * sc.cap_inv) >> 8);
462 if (Overwrite) *ptr = c;
else *ptr += c;
464 }
else if (sc.cap == LineCap::SQUARE) {
465 if (dot >= -sc.dot_ext_q && dot <= sc.len2_q + sc.dot_ext_q) {
466 fl::u16 shifted =
static_cast<fl::u16
>(
467 static_cast<fl::u32
>(abs_cross) >> sc.aa_shift);
468 fl::u8 linear_idx =
static_cast<fl::u8>((shifted * sc.aa_inv) >> 8);
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;
497template<
typename PixelT,
typename Coord>
499 Coord x0, Coord y0, Coord x1, Coord y1,
502template<
typename PixelT,
typename Coord>
504 Coord cx, Coord cy, Coord r,
507template<
typename PixelT,
typename Coord>
509 Coord cx, Coord cy, Coord r, Coord thickness,
512template<
typename PixelT,
typename Coord>
514 Coord x0, Coord y0, Coord x1, Coord y1, Coord thickness,
531template<
typename PixelT,
typename Coord,
bool Overwrite>
534 PixelT* pixels = canvas.pixels;
535 int width = canvas.width;
536 int height = canvas.height;
548 fl::i32 dx8 = fx1 - fx0;
549 fl::i32 dy8 = fy1 - fy0;
552 fl::i32 gradient = (dx8 == 0) ? 0 : ((dy8 << 8) / dx8);
555 fl::i32 xend = (fx0 + 128) & ~0xFF;
556 fl::i32 yend = fy0 + ((gradient * (xend - fx0)) >> 8);
557 fl::i32 xgap = 256 - ((fx0 + 128) & 0xFF);
558 int xpxl1 = xend >> 8;
559 int ypxl1 = yend >> 8;
563 fl::i32 xend2 = (fx1 + 128) & ~0xFF;
564 fl::i32 yend2 = fy1 + ((gradient * (xend2 - fx1)) >> 8);
565 fl::i32 xgap2 = (fx1 + 128) & 0xFF;
566 int xpxl2 = xend2 >> 8;
567 int ypxl2 = yend2 >> 8;
572 fl::u8 b1 =
static_cast<fl::u8>(((255 - yfrac1) * xgap) >> 8);
575 PixelT c =
color; c.nscale8(b1);
577 c =
color; c.nscale8(b2);
580 PixelT c =
color; c.nscale8(b1);
582 c =
color; c.nscale8(b2);
589 fl::u8 b1 =
static_cast<fl::u8>(((255 - yfrac2) * xgap2) >> 8);
592 PixelT c =
color; c.nscale8(b1);
594 c =
color; c.nscale8(b2);
597 PixelT c =
color; c.nscale8(b1);
599 c =
color; c.nscale8(b2);
605 fl::i32 intery = yend + gradient;
607 for (
int x = xpxl1 + 1;
x < xpxl2; ++
x) {
610 PixelT c =
color; c.nscale8(255 - frac);
612 c =
color; c.nscale8(frac);
617 for (
int x = xpxl1 + 1;
x < xpxl2; ++
x) {
620 PixelT c =
color; c.nscale8(255 - frac);
622 c =
color; c.nscale8(frac);
629template<
typename PixelT,
typename Coord,
bool Overwrite>
633template<
typename PixelT,
typename Coord,
bool Overwrite>
635 Coord cx, Coord cy, Coord r, Coord thickness)
FL_NO_EXCEPT;
637template<
typename PixelT,
typename Coord,
bool Overwrite>
639 Coord x0, Coord y0, Coord x1, Coord y1,
644template<
typename PixelT,
typename Coord>
646 Coord x0, Coord y0, Coord x1, Coord y1,
657template<
typename PixelT,
typename Coord,
bool Overwrite>
660 PixelT* pixels = canvas.pixels;
661 int width = canvas.width;
662 int height = canvas.height;
668 fl::i32 rin8 = r8 - 128;
669 fl::i32 rout8 = r8 + 128;
671 fl::i32 rin2 = rin8 * rin8;
672 fl::i32 rout2 = rout8 * rout8;
673 fl::i32 band = rout2 - rin2;
674 if (band <= 0)
return;
676 int ri = (rout8 >> 8) + 1;
680 int xmin = cxi - ri;
if (xmin < 0) xmin = 0;
681 int xmax = cxi + ri;
if (xmax >=
width) xmax =
width - 1;
682 if (xmin > xmax)
return;
683 if (cyi + ri < 0 || cyi - ri >=
height)
return;
685 fl::i32 dx8 = (
static_cast<fl::i32
>(xmin) << 8) - cx8;
686 fl::i32 dx2 = dx8 * dx8;
689 fc.
xdelta0 = 512 * dx8 + 65536;
695 fl::i32 cyfrac = (
static_cast<fl::i32
>(cyi) << 8) - cy8;
696 fl::i32 d2c = dx2 + cyfrac * cyfrac;
698 if (cyi >= 0 && cyi <
height)
701 fl::i32 botd2 = d2c, botdelta = 512 * cyfrac + 65536;
702 fl::i32 topd2 = d2c, topdelta = -512 * cyfrac + 65536;
703 botd2 += botdelta; botdelta += 131072;
704 topd2 += topdelta; topdelta += 131072;
706 for (
int dy = 1; dy <= ri; ++dy) {
707 bool cbot = (botd2 - dx2 <= rout2);
708 bool ctop = (topd2 - dx2 <= rout2);
709 if (!cbot && !ctop)
break;
710 int pyb = cyi + dy, pyt = cyi - dy;
711 if (cbot && pyb >= 0 && pyb <
height)
713 if (ctop && pyt >= 0 && pyt <
height)
715 botd2 += botdelta; botdelta += 131072;
716 topd2 += topdelta; topdelta += 131072;
720template<
typename PixelT,
typename Coord>
722 Coord cx, Coord cy, Coord r,
733template<
typename PixelT,
typename Coord,
bool Overwrite>
735 Coord cx, Coord cy, Coord r, Coord thickness)
FL_NO_EXCEPT {
736 PixelT* pixels = canvas.pixels;
737 int width = canvas.width;
738 int height = canvas.height;
745 fl::i32 r_ii8 = r8 - 128;
746 fl::i32 r_io8 = r8 + 128;
747 fl::i32 r_oi8 = r8 + t8 - 128;
748 fl::i32 r_oo8 = r8 + t8 + 128;
750 if (r_ii8 < 0) r_ii8 = 0;
751 if (r_io8 < 0) r_io8 = 0;
753 fl::i32 ii2 = r_ii8 * r_ii8;
754 fl::i32 io2 = r_io8 * r_io8;
755 fl::i32 oi2 = r_oi8 * r_oi8;
756 fl::i32 oo2 = r_oo8 * r_oo8;
758 fl::i32 inner_band = io2 - ii2;
759 fl::i32 outer_band = oo2 - oi2;
761 int ri = (r_oo8 >> 8) + 1;
765 int xmin = cxi - ri;
if (xmin < 0) xmin = 0;
766 int xmax = cxi + ri;
if (xmax >=
width) xmax =
width - 1;
767 if (xmin > xmax)
return;
768 if (cyi + ri < 0 || cyi - ri >=
height)
return;
770 fl::i32 dx8 = (
static_cast<fl::i32
>(xmin) << 8) - cx8;
771 fl::i32 dx2 = dx8 * dx8;
774 gc.
xdelta0 = 512 * dx8 + 65536;
783 fl::i32 cyfrac = (
static_cast<fl::i32
>(cyi) << 8) - cy8;
784 fl::i32 d2c = dx2 + cyfrac * cyfrac;
786 if (cyi >= 0 && cyi <
height)
789 fl::i32 botd2 = d2c, botdelta = 512 * cyfrac + 65536;
790 fl::i32 topd2 = d2c, topdelta = -512 * cyfrac + 65536;
791 botd2 += botdelta; botdelta += 131072;
792 topd2 += topdelta; topdelta += 131072;
794 for (
int dy = 1; dy <= ri; ++dy) {
795 bool cbot = (botd2 - dx2 <= oo2);
796 bool ctop = (topd2 - dx2 <= oo2);
797 if (!cbot && !ctop)
break;
798 int pyb = cyi + dy, pyt = cyi - dy;
799 if (cbot && pyb >= 0 && pyb <
height)
801 if (ctop && pyt >= 0 && pyt <
height)
803 botd2 += botdelta; botdelta += 131072;
804 topd2 += topdelta; topdelta += 131072;
808template<
typename PixelT,
typename Coord>
810 Coord cx, Coord cy, Coord r, Coord thickness,
821template<
typename PixelT,
typename Coord,
bool Overwrite>
823 Coord x0, Coord y0, Coord x1, Coord y1,
825 PixelT* pixels = canvas.pixels;
826 int width = canvas.width;
827 int height = canvas.height;
831 fl::i32 dx_8 = x1_8 - x0_8;
832 fl::i32 dy_8 = y1_8 - y0_8;
833 if (dx_8 == 0 && dy_8 == 0)
return;
835 fl::i32 len2_16 = dx_8 * dx_8 + dy_8 * dy_8;
836 fl::i32 len_8 =
static_cast<fl::i32
>(
839 fl::i32 r_max_8 = thickness_8 >> 1;
840 fl::i32 threshold_q = r_max_8 * len_8;
842 if (threshold_q <= 0)
return;
844 int x0i = x0_8 >> 8, y0i = y0_8 >> 8;
845 int x1i = x1_8 >> 8, y1i = y1_8 >> 8;
846 int margin = ((r_max_8 + 255) >> 8) + 2;
847 int xmin = (x0i < x1i ? x0i : x1i) - margin;
848 int xmax = (x0i > x1i ? x0i : x1i) + margin;
849 int ymin = (y0i < y1i ? y0i : y1i) - margin;
850 int ymax = (y0i > y1i ? y0i : y1i) + margin;
852 if (xmin < 0) xmin = 0;
854 if (ymin < 0) ymin = 0;
856 if (xmin > xmax || ymin > ymax)
return;
858 fl::i32 dx_q = dx_8 << 8;
859 fl::i32 dy_q = dy_8 << 8;
861 fl::i32 rx_base_8 = (
static_cast<fl::i32
>(xmin) << 8) - x0_8;
862 fl::i32 ry_row_8 = (
static_cast<fl::i32
>(ymin) << 8) - y0_8;
863 fl::i32 cross_row_q = rx_base_8 * dy_8 - ry_row_8 * dx_8;
864 fl::i32 dot_row_q = rx_base_8 * dx_8 + ry_row_8 * dy_8;
866 fl::i32 len2_q = len_8 * len_8;
867 fl::i32 dot_ext_q = (cap == LineCap::SQUARE) ? threshold_q : 0;
880 if (cap == LineCap::ROUND && sc.
r_max2_8 > 0) {
887 for (
int py = ymin; py <= ymax; ++py) {
888 if (py >= 0 && py <
height) {
890 cross_row_q, dot_row_q, sc);
892 cross_row_q -= sc.
dx_q;
893 dot_row_q += sc.
dy_q;
897template<
typename PixelT,
typename Coord>
899 Coord x0, Coord y0, Coord x1, Coord y1, Coord thickness,
Canvas types for gfx primitives (implementation)
Generic canvas for any pixel type (e.g.
static constexpr i32 SCALE
static constexpr FASTLED_FORCE_INLINE s16x16 from_raw(i32 raw) FL_NO_EXCEPT
#define FL_PGM_READ_BYTE_NEAR(x)
Read a byte (8-bit) from PROGMEM memory.
Legacy compatibility header for 8-bit scaling functions.
Compile-time linker keep-alive hook for a single fl::Bus.
Coord aaRatioDispatch(Coord num, Coord, Coord inv_denom, fl::false_type) FL_NO_EXCEPT
void drawRingCore(Canvas< PixelT > &canvas, const PixelT &color, Coord cx, Coord cy, Coord r, Coord thickness) FL_NO_EXCEPT
void drawLineCore(Canvas< PixelT > &canvas, const PixelT &color, Coord x0, Coord y0, Coord x1, Coord y1) FL_NO_EXCEPT
void drawDiscCore(Canvas< PixelT > &canvas, const PixelT &color, Coord cx, Coord cy, Coord r) FL_NO_EXCEPT
void renderDiscRow(PixelT *buf, int w, int py, fl::i32 d2_row, const DiscCtx< PixelT > &f) FL_NO_EXCEPT
Render one scanline of a disc using incremental d².
void renderRingRow(PixelT *buf, int w, int py, fl::i32 d2_row, const RingCtx< PixelT > &g) FL_NO_EXCEPT
Render one scanline of a ring using incremental d² with phase-based scanning.
void drawStrokeLineCore(Canvas< PixelT > &canvas, const PixelT &color, Coord x0, Coord y0, Coord x1, Coord y1, Coord thickness, LineCap cap) FL_NO_EXCEPT
fl::i32 toQ16(Coord val) FL_NO_EXCEPT
Convert any Coord type to Q16.16 raw i32 for integer inner loops.
fl::i32 toFixed8(Coord val) FL_NO_EXCEPT
Convert any Coord type to 8.8 fixed-point (fl::i32).
void computeBandShift(fl::i32 band, fl::u8 &shift_out, fl::u16 &inv_out) FL_NO_EXCEPT
Precompute right-shift and reciprocal multiplier for AA division.
void renderStrokeRow(PixelT *buf, int w, int py, fl::i32 cross_start, fl::i32 dot_start, const StrokeCtx< PixelT > &sc) FL_NO_EXCEPT
Render one scanline of a stroke line using phase-based scanning.
const fl::u8 distanceAA_LUT[256]
Distance antialiasing lookup table Maps normalized squared distance d²/r_max² (scaled 0....
============================================================================
Stroke line context: bundles per-line constants into a struct passed by reference.
Ring context: bundles all per-circle constants into a struct passed by reference.
Disc context: bundles per-circle constants into a struct passed by reference.
T fromInt(int n) FL_NO_EXCEPT
Convert an integer to Coord without float intermediate.
void drawStrokeLine(Canvas< PixelT > &canvas, const PixelT &color, Coord x0, Coord y0, Coord x1, Coord y1, Coord thickness, LineCap cap, fl::DrawMode mode=fl::DrawMode::DRAW_MODE_BLEND) FL_NO_EXCEPT
fl::u8 coordToU8< float >(float alpha) FL_NO_EXCEPT
int toInt< double >(const double &val) FL_NO_EXCEPT
fl::u8 coordToU8< double >(double alpha) FL_NO_EXCEPT
LineCap
Line cap styles for stroke operations.
fl::s16x16 fromFrac< fl::s16x16 >(int p, int q) FL_NO_EXCEPT
void drawLine(Canvas< PixelT > &canvas, const PixelT &color, Coord x0, Coord y0, Coord x1, Coord y1, fl::DrawMode mode=fl::DrawMode::DRAW_MODE_BLEND) FL_NO_EXCEPT
============================================================================
int toInt< int >(const int &val) FL_NO_EXCEPT
int toInt(const T &val) FL_NO_EXCEPT
Helper to convert any coordinate type to int Supports: s16x16 (via to_int()), float,...
fl::u8 coordToU8< fl::s16x16 >(fl::s16x16 alpha) FL_NO_EXCEPT
T fromFrac(int p, int q) FL_NO_EXCEPT
Convert rational p/q to Coord without float.
float halfOf< float >(float val)
void drawRing(Canvas< PixelT > &canvas, const PixelT &color, Coord cx, Coord cy, Coord r, Coord thickness, fl::DrawMode mode=fl::DrawMode::DRAW_MODE_BLEND) FL_NO_EXCEPT
void addPixelToBuffer(PixelT *pixels, int width, int height, int x, int y, const PixelT &color) FL_NO_EXCEPT
Internal helper: add or set pixel to rectangular buffer with bounds checking Direct row-major indexin...
fl::u8 coordToU8< int >(int alpha) FL_NO_EXCEPT
Coord aaRatio(Coord num, Coord denom, Coord inv_denom) FL_NO_EXCEPT
Compute num/denom using the best strategy for the Coord type:
int halfOf< int >(int val) FL_NO_EXCEPT
T halfOf(T val) FL_NO_EXCEPT
Divide Coord by 2 using shift (avoids expensive division on embedded).
fl::s16x16 fromInt< fl::s16x16 >(int n) FL_NO_EXCEPT
fl::u8 coordToU8(T alpha) FL_NO_EXCEPT
sqrt is provided by fl::sqrt overloads in math.h for:
int toInt< float >(const float &val) FL_NO_EXCEPT
fl::s16x16 halfOf< fl::s16x16 >(fl::s16x16 val) FL_NO_EXCEPT
void drawDisc(Canvas< PixelT > &canvas, const PixelT &color, Coord cx, Coord cy, Coord r, fl::DrawMode mode=fl::DrawMode::DRAW_MODE_BLEND) FL_NO_EXCEPT
double halfOf< double >(double val)
void swap(array< T, N > &lhs, array< T, N > &rhs) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
FL_OPTIMIZE_FUNCTION constexpr u16 isqrt32(u32 x) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type clamp(T x, T lo, T hi) FL_NO_EXCEPT
integral_constant< bool, false > false_type
integral_constant< bool, B > bool_constant
enable_if<!is_integral< T >::value, T >::type round(T value) FL_NO_EXCEPT
gfx::LineCap LineCap
Line cap style.
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NO_EXCEPT
integral_constant< bool, true > true_type
Base definition for an LED controller.
Simple rectangular canvas for graphics operations Combines a pixel buffer with dimensions for cache-o...