| 62 | } |
| 63 | |
| 64 | u8 easeInOutQuad8(u8 i) { |
| 65 | constexpr u16 MAX = 0xFF; // 255 |
| 66 | constexpr u16 HALF = (MAX + 1) >> 1; // 128 |
| 67 | constexpr u16 DENOM = MAX; // divisor for scaling |
| 68 | constexpr u16 ROUND = DENOM >> 1; // for rounding |
| 69 | |
| 70 | if (i < HALF) { |
| 71 | // first half: y = 2·(i/MAX)² → y_i = 2·i² / MAX |
| 72 | u32 t = i; |
| 73 | u32 num = 2 * t * t + ROUND; // 2*i², +half for rounding |
| 74 | return u8(num / DENOM); |
| 75 | } else { |
| 76 | // second half: y = 1 − 2·(1−i/MAX)² |
| 77 | // → y_i = MAX − (2·(MAX−i)² / MAX) |
| 78 | u32 d = MAX - i; |
| 79 | u32 num = 2 * d * d + ROUND; // 2*(MAX−i)², +half for rounding |
| 80 | return u8(MAX - (num / DENOM)); |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | u8 easeInOutCubic8(u8 i) { |
| 85 | constexpr u16 MAX = 0xFF; // 255 |
no outgoing calls
no test coverage detected