| 193 | } |
| 194 | |
| 195 | u16 easeInOutQuad16(u16 x) { |
| 196 | // 16-bit quadratic ease-in / ease-out function |
| 197 | constexpr u32 MAX = 0xFFFF; // 65535 |
| 198 | constexpr u32 HALF = (MAX + 1) >> 1; // 32768 |
| 199 | constexpr u32 DENOM = MAX; // divisor |
| 200 | constexpr u32 ROUND = DENOM >> 1; // for rounding |
| 201 | |
| 202 | if (x < HALF) { |
| 203 | // first half: y = 2·(x/MAX)² → y_i = 2·x² / MAX |
| 204 | fl::u64 xi = x; |
| 205 | fl::u64 num = 2 * xi * xi + ROUND; // 2*x², +half for rounding |
| 206 | return u16(num / DENOM); |
| 207 | } else { |
| 208 | // second half: y = 1 − 2·(1−x/MAX)² → y_i = MAX − (2·(MAX−x)² / MAX) |
| 209 | fl::u64 d = MAX - x; |
| 210 | fl::u64 num = 2 * d * d + ROUND; // 2*(MAX−x)², +half for rounding |
| 211 | return u16(MAX - (num / DENOM)); |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | u16 easeInOutCubic16(u16 x) { |
| 216 | const u32 MAX = 0xFFFF; // 65535 |
no outgoing calls
no test coverage detected