813 {
816
817
818 constexpr s16x16 half_fp(0.5f);
819 constexpr s16x16 min_persistence(0.001f);
823 : min_persistence;
825
827
828 i32 w_q16 = static_cast<i32>(w) << 16;
829 i32 h_q16 = static_cast<i32>(h) << 16;
830
831
832 i32 *__restrict__ r =
mState.r.data();
833 i32 *__restrict__ g =
mState.g.data();
834 i32 *__restrict__ b =
mState.b.data();
835 i32 *__restrict__ tr =
mState.tr.data();
836 i32 *__restrict__ tg =
mState.tg.data();
837 i32 *__restrict__ tb =
mState.tb.data();
838
839
840
841
842 for (
int y = 0;
y < h;
y++) {
843 i32 sh =
static_cast<i32
>((
static_cast<i64>(
mState.y_prof[
y]) * shift_raw) >> 16);
844 int row_base =
y * w;
845 for (
int x = 0;
x < w;
x++) {
846 i32 sx_raw = (
static_cast<i32
>(
x) << 16) - sh;
847
848 if (sx_raw < 0) sx_raw += w_q16;
849 else if (sx_raw >= w_q16) sx_raw -= w_q16;
850
851 if (sx_raw < 0) sx_raw += w_q16;
852 if (sx_raw >= w_q16) sx_raw -= w_q16;
853
854 int ix0 = sx_raw >> 16;
855 int ix1 = (ix0 + 1 < w) ? ix0 + 1 : 0;
856 i32 f = sx_raw & 0xFFFF;
857
858 int src0 = row_base + ix0;
859 int src1 = row_base + ix1;
860 int dst = row_base +
x;
861
862 tr[dst] = r[src0] +
static_cast<i32
>((
static_cast<i64>(r[src1] - r[src0]) * f) >> 16);
863 tg[dst] = g[src0] +
static_cast<i32
>((
static_cast<i64>(g[src1] - g[src0]) * f) >> 16);
864 tb[dst] = b[src0] +
static_cast<i32
>((
static_cast<i64>(b[src1] - b[src0]) * f) >> 16);
865 }
866 }
867
868
869
870 for (
int x = 0;
x < w;
x++) {
871 i32 sh =
static_cast<i32
>((
static_cast<i64>(
mState.x_prof[
x]) * shift_raw) >> 16);
872 for (
int y = 0;
y < h;
y++) {
873 i32 sy_raw = (
static_cast<i32
>(
y) << 16) - sh;
874 if (sy_raw < 0) sy_raw += h_q16;
875 else if (sy_raw >= h_q16) sy_raw -= h_q16;
876 if (sy_raw < 0) sy_raw += h_q16;
877 if (sy_raw >= h_q16) sy_raw -= h_q16;
878
879 int iy0 = sy_raw >> 16;
880 int iy1 = (iy0 + 1 < h) ? iy0 + 1 : 0;
881 i32 f = sy_raw & 0xFFFF;
882
883 int src0 = iy0 * w +
x;
884 int src1 = iy1 * w +
x;
886
887
888 i32 interp_r = tr[src0] +
static_cast<i32
>((
static_cast<i64>(tr[src1] - tr[src0]) * f) >> 16);
889 i32 interp_g = tg[src0] +
static_cast<i32
>((
static_cast<i64>(tg[src1] - tg[src0]) * f) >> 16);
890 i32 interp_b = tb[src0] +
static_cast<i32
>((
static_cast<i64>(tb[src1] - tb[src0]) * f) >> 16);
891
892 r[dst] =
static_cast<i32
>((
static_cast<i64>(interp_r) *
fade_raw) >> 16);
893 g[dst] =
static_cast<i32
>((
static_cast<i64>(interp_g) *
fade_raw) >> 16);
894 b[dst] =
static_cast<i32
>((
static_cast<i64>(interp_b) *
fade_raw) >> 16);
895 }
896 }
897}
static constexpr FASTLED_FORCE_INLINE s16x16 from_raw(i32 raw) FL_NOEXCEPT
constexpr i32 raw() const FL_NOEXCEPT
static FASTLED_FORCE_INLINE s16x16 pow(s16x16 base, s16x16 exp) FL_NOEXCEPT
void fade_raw(CRGB *leds, fl::u16 num_leds, fl::u8 fadeBy)