acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
alphaBlend_Test.ino (6866B)
1 /* 2 This tests the alpha blending function that is used with the anti-aliased 3 fonts: 4 5 Alpha = 0 = 100% background, alpha = 255 = 100% foreground colour 6 7 blendedColor = tft.alphaBlend(alpha, fg_color, bg_color); 8 9 The alphaBlend() function operates on 16 bit colours only 10 A test is included where the colours are mapped to 8 bits after blending 11 12 Information on alpha blending is here 13 https://en.wikipedia.org/wiki/Alpha_compositing 14 15 Example for library: 16 https://github.com/Bodmer/TFT_eSPI 17 18 The sketch has been tested on a 320x240 ILI9341 based TFT, it 19 could be adapted for other screen sizes. 20 21 Created by Bodmer 10/2/18 22 23 ######################################################################### 24 ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### 25 ######################################################################### 26 */ 27 28 #include <TFT_eSPI.h> // Include the graphics library 29 30 TFT_eSPI tft = TFT_eSPI(); // Create object "tft" 31 32 // ------------------------------------------------------------------------- 33 // Setup 34 // ------------------------------------------------------------------------- 35 void setup(void) { 36 tft.init(); 37 tft.setRotation(0); 38 tft.fillScreen(TFT_DARKGREY); 39 } 40 41 // ------------------------------------------------------------------------- 42 // Main loop 43 // ------------------------------------------------------------------------- 44 void loop() 45 { 46 // 16 bit colours (5 bits red, 6 bits green, 5 bits blue) 47 // Blend from white to full spectrum 48 for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground 49 { 50 for (int c = 0; c < 192; c++) tft.drawPixel(c, a/2, tft.alphaBlend(a, rainbow(c), TFT_WHITE)); 51 } 52 53 // Blend from full spectrum to black 54 for (int a = 255; a > 2; a-=2) 55 { 56 for (int c = 0; c < 192; c++) tft.drawPixel(c, 128 + (255-a)/2, tft.alphaBlend(a, rainbow(c), TFT_BLACK)); 57 } 58 59 // Blend from white to black (32 grey levels) 60 for (uint16_t a = 0; a < 255; a++) // Alpha 0 = 100% background, alpha 255 = 100% foreground 61 { 62 tft.drawFastHLine(192, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_WHITE)); 63 tft.drawFastHLine(204, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_RED)); 64 tft.drawFastHLine(216, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_GREEN)); 65 tft.drawFastHLine(228, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_BLUE)); 66 } 67 68 delay(4000); 69 70 // Blend from white to colour (32 grey levels) 71 for (uint16_t a = 0; a < 255; a++) // Alpha 0 = 100% background, alpha 255 = 100% foreground 72 { 73 //tft.drawFastHLine(192, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_WHITE)); 74 tft.drawFastHLine(204, a, 12, tft.alphaBlend(a, TFT_RED, TFT_WHITE)); 75 tft.drawFastHLine(216, a, 12, tft.alphaBlend(a, TFT_GREEN, TFT_WHITE)); 76 tft.drawFastHLine(228, a, 12, tft.alphaBlend(a, TFT_BLUE, TFT_WHITE)); 77 } 78 79 delay(4000); 80 81 //* 82 // Decrease to 8 bit colour (3 bits red, 3 bits green, 2 bits blue) 83 // Blend from white to full spectrum 84 for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground 85 { 86 // Convert blended 16 bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying 87 for (int c = 0; c < 192; c++) tft.drawPixel(c, a/2, tft.color8to16(tft.color16to8(tft.alphaBlend(a, rainbow(c), 0xFFFF)))); 88 } 89 90 // Blend from full spectrum to black 91 for (int a = 255; a > 2; a-=2) 92 { 93 // Convert blended 16 bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying 94 for (int c = 0; c < 192; c++) tft.drawPixel(c, 128 + (255-a)/2, tft.color8to16(tft.color16to8(tft.alphaBlend(a, rainbow(c), 0)))); 95 } 96 97 // Blend from white to black (4 grey levels - it will draw 4 more with a blue tinge due to lower blue bit count) 98 // Blend from black to a primary colour 99 for (uint16_t a = 0; a < 255; a++) // Alpha 0 = 100% background, alpha 255 = 100% foreground 100 { 101 tft.drawFastHLine(192, a, 12, tft.color8to16(tft.color16to8(tft.alphaBlend(a, TFT_BLACK, TFT_WHITE)))); 102 tft.drawFastHLine(204, a, 12, tft.color8to16(tft.color16to8(tft.alphaBlend(a, TFT_BLACK, TFT_RED)))); 103 tft.drawFastHLine(216, a, 12, tft.color8to16(tft.color16to8(tft.alphaBlend(a, TFT_BLACK, TFT_GREEN)))); 104 tft.drawFastHLine(228, a, 12, tft.color8to16(tft.color16to8(tft.alphaBlend(a, TFT_BLACK, TFT_BLUE)))); 105 } 106 107 delay(4000); 108 //*/ 109 110 /* 111 // 16 bit colours (5 bits red, 6 bits green, 5 bits blue) 112 for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground 113 { 114 for (int c = 0; c < 192; c++) tft.drawPixel(c, a/2, tft.alphaBlend(a, rainbow(c), TFT_CYAN)); 115 } 116 117 // Blend from full spectrum to cyan 118 for (int a = 255; a > 2; a-=2) 119 { 120 for (int c = 0; c < 192; c++) tft.drawPixel(c, 128 + (255-a)/2, tft.alphaBlend(a, rainbow(c), TFT_YELLOW)); 121 } 122 //*/ 123 124 /* 125 // Blend other colour transitions for test purposes 126 for (uint16_t a = 0; a < 255; a++) // Alpha 0 = 100% background, alpha 255 = 100% foreground 127 { 128 tft.drawFastHLine(192, a, 12, tft.alphaBlend(a, TFT_WHITE, TFT_WHITE)); // Should show as solid white 129 tft.drawFastHLine(204, a, 12, tft.alphaBlend(a, TFT_BLACK, TFT_BLACK)); // Should show as solid black 130 tft.drawFastHLine(216, a, 12, tft.alphaBlend(a, TFT_YELLOW, TFT_CYAN)); // Brightness should be fairly even 131 tft.drawFastHLine(228, a, 12, tft.alphaBlend(a, TFT_CYAN, TFT_MAGENTA));// Brightness should be fairly even 132 } 133 134 delay(4000); 135 //*/ 136 } 137 138 139 // ######################################################################### 140 // Return a 16 bit rainbow colour 141 // ######################################################################### 142 unsigned int rainbow(byte value) 143 { 144 // If 'value' is in the range 0-159 it is converted to a spectrum colour 145 // from 0 = red through to 127 = blue to 159 = violet 146 // Extending the range to 0-191 adds a further violet to red band 147 148 value = value%192; 149 150 byte red = 0; // Red is the top 5 bits of a 16 bit colour value 151 byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here 152 byte blue = 0; // Blue is the bottom 5 bits 153 154 byte sector = value >> 5; 155 byte amplit = value & 0x1F; 156 157 switch (sector) 158 { 159 case 0: 160 red = 0x1F; 161 green = amplit; // Green ramps up 162 blue = 0; 163 break; 164 case 1: 165 red = 0x1F - amplit; // Red ramps down 166 green = 0x1F; 167 blue = 0; 168 break; 169 case 2: 170 red = 0; 171 green = 0x1F; 172 blue = amplit; // Blue ramps up 173 break; 174 case 3: 175 red = 0; 176 green = 0x1F - amplit; // Green ramps down 177 blue = 0x1F; 178 break; 179 case 4: 180 red = amplit; // Red ramps up 181 green = 0; 182 blue = 0x1F; 183 break; 184 case 5: 185 red = 0x1F; 186 green = 0; 187 blue = 0x1F - amplit; // Blue ramps down 188 break; 189 } 190 191 return red << 11 | green << 6 | blue; 192 } 193 194