Bonjour,
Dans le code précédent, il y a un petit défaut.
Si xy > 255, la composante G qui doit varier de 0 à 63 a une résolution "dégradée", la variation se fait sur 5 bits (G = (0 ... 31) * 2) au lieu de 6
Le code suivant corrige cela :
Par rapport au code optimisé précédent, la perte de performance reste limitée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 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) { if (xy > 255) { delta = ((uint32_t)xy << 8) / delta; //A = delta << 1; } else { delta = (xy << 8) / delta; //A = delta; } A = delta; // A = 0 -> 255 if (ColGradient_Type & 0b10000000) A = 255 - A; 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; } 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; }
34 octets de flash en plus
Pour la vitesse :
- Fixed Middle H : perte moyenne de 1,0%
- Fixed Middle V : perte moyenne de 0,6%
- Normal H : perte moyenne de 1,0%
- Normal V : perte moyenne de 0,6%
- Rainbow H : perte moyenne de 1,2%
- Rainbow V : perte moyenne de 3,7%
Ca reste cependant plus performant que la version initiale, et cette fois-ci c'est parfaitement équivalent
La différence n'est cependant pas perceptible... L'afficheur TFT ILI9341 a du mal à rendre les couleurs avec fidélité... on le voit assez bien lorsque le dégradé est fait sur l'écran entier.
En revanche c'est plus joli lorsque le dégradé est fait sur un motif plus "aéré" ou plus petit.
5 bits de résolution pour G reste suffisant
Conclusion si on veut de la rapidité et qu'on souhaite gagner un peu de flash autant rester sur la version précédente.
Espérons que cela soit utile à ceux qui utilisent cet afficheur.
un dégradé sur un écran entier est un test assez difficile pour un afficheur, c'est une bonne façon de comparer les afficheurs entre eux.
Partager