| 82 | } |
| 83 | |
| 84 | u8 easeInOutCubic8(u8 i) { |
| 85 | constexpr u16 MAX = 0xFF; // 255 |
| 86 | constexpr u16 HALF = (MAX + 1) >> 1; // 128 |
| 87 | constexpr u32 DENOM = (u32)MAX * MAX; // 255*255 = 65025 |
| 88 | constexpr u32 ROUND = DENOM >> 1; // for rounding |
| 89 | |
| 90 | if (i < HALF) { |
| 91 | // first half: y = 4·(i/MAX)³ → y_i = 4·i³ / MAX² |
| 92 | u32 ii = i; |
| 93 | u32 cube = ii * ii * ii; // i³ |
| 94 | u32 num = 4 * cube + ROUND; // 4·i³, +half denom for rounding |
| 95 | return u8(num / DENOM); |
| 96 | } else { |
| 97 | // second half: y = 1 − ((−2·t+2)³)/2 |
| 98 | // where t = i/MAX; equivalently: |
| 99 | // y_i = MAX − (4·(MAX−i)³ / MAX²) |
| 100 | u32 d = MAX - i; |
| 101 | u32 cube = d * d * d; // (MAX−i)³ |
| 102 | u32 num = 4 * cube + ROUND; |
| 103 | return u8(MAX - (num / DENOM)); |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | u8 easeOutQuad8(u8 i) { |
| 108 | // ease-out is the inverse of ease-in: 1 - (1-t)² |
no outgoing calls
no test coverage detected