1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| uint16_t ColGradient_Colour_Calc(int xy) {
if (ColGradient_Swap) xy = ColGradient_WH - xy; else xy -= ColGradient_XY_min;
if (xy < 0) return ColGradient1;
uint16_t delta = ColGradient_XY_delta;
if (xy > delta) return ColGradient2;
// ColGradient_Type
// 00000000 Gradient
// 01000000 Rainbow
// 11000000 Rainbow Inv
// 10000000 FixedMiddle
if (ColGradient_Type == 0b10000000) return Colour[Coul_Index];
byte R, G, B, A;
if (ColGradient_Type & 0b01000000) {
/*
// 4% Slower but accurate on G value when xy > 255
if (xy > 255) {
delta = ((uint32_t)xy << 8) / delta;
} else {
delta = (xy << 8) / delta;
}
A = delta;
*/
/*
// 1% Slower but less accurate on G value when xy > 255 - Save 17 bytes of flash
if (xy > 255) {
delta = (xy << 7) / delta;
A = delta << 1;
} else {
delta = (xy << 8) / delta;
A = delta;
}
if (ColGradient_Type & 0b10000000) A = 255 - A;
// A = 0 -> 255
if (A < 128) {
if (A < 64) return 0xF800 | (A << 5); // A = 0-> 63 R = 31 G = 0->63 B = 0
R = 63 - (A >> 1); // A = 64->127 R = 31->0 G = 63 B = 0
return (R << 11) | 0x7E0;
}
if (A < 192) { // A = 128->191 R = 0 G = 63->0 B = 0->31
G = 191 - A;
B = (A >> 1) - 64;
return (G << 5) | B;
}
R = (A >> 1) - 96; // A = 192->255 R = 0->31 G = 0 B = 31
return (R << 11) | 31;
*/
// Faster but less accurate on G value - Save 44 bytes of flash
delta = (xy << 7) / delta;
A = delta;
if (ColGradient_Type & 0b10000000) A = 127 - A;
// A = 0 -> 127
if (A < 64) {
if (A < 32) return 0xF800 | (A << 6); // A = 0-> 31 R = 31 G = 0->63 B = 0
R = 63 - A; // A = 32->63 R = 31->0 G = 63 B = 0
return (R << 11) | 0x7E0;
}
if (A < 96) { // A = 64->95 R = 0 G = 63->0 B = 0->31
G = 191 - (A << 1);
B = A - 64;
return (G << 5) | B;
}
R = A - 96; // A = 96->127 R = 0->31 G = 0 B = 31
return (R << 11) | 31;
}
R = ColGradient_R;
G = ColGradient_G;
B = ColGradient_B;
A = (xy << 6) / delta;
if (ColGradient_DR !=0) R += (ColGradient_DR * A) >> 6;
if (ColGradient_DG !=0) G += (ColGradient_DG * A) >> 6;
if (ColGradient_DB !=0) B += (ColGradient_DB * A) >> 6;
return (R << 11) | (G << 5) | B;
} |