43 {
44 uint8_t src = *brightness_src;
45 if (*brightness_dst == 0 || src == 0) {
46 return 0;
47 }
48 uint16_t overflow_mask = 0b1000000000000000;
49 for (uint8_t i = 1; i < steps; i++) {
50 overflow_mask >>= 1;
51 overflow_mask |= 0b1000000000000000;
52 }
53 const uint8_t underflow_mask = 0x1;
54
55
56
57 uint16_t curr = *brightness_dst;
58 uint8_t shifts = 0;
59 for (uint8_t i = 0; i < max_shifts; i++) {
60 if (src & underflow_mask) {
61 break;
62 }
63 if (curr & overflow_mask) {
64
65 break;
66 }
67 curr <<= steps;
68 src >>= 1;
69 shifts++;
70 }
71
72 *brightness_dst = curr;
73 *brightness_src = src;
74 return shifts;
75}