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

Font_Demo_3.ino (7937B)

      1 /*
      2   There are four different methods of plotting anti-aliased fonts to the screen.
      3 
      4   This sketch uses method 3, the font characters are first plotted in a Sprite, then the
      5   Sprite is pushed to the screen. This method is very flexible and the Sprite can be
      6   created, deleted, resized as needed. To render anti-aliased fonts well the Sprite
      7   needs to be 16 bit.  The fonts will render in 1 bit per pixel sprites but there
      8   will then be no anti-aliasing. Using 1 bit per pixel Sprites is however useful
      9   to use the extended Unicode range in fonts on mono displays like ePaper.
     10 
     11   A single Sprite can be re-used for plotting different values and graphics to
     12   different positions on the screen. This makes this method a very powerful display tool,
     13   for example round buttons can be created, making use of transparent colour plotting.
     14   
     15 */
     16 //  The fonts used are in the sketch data folder, press Ctrl+K to view.
     17 
     18 //  Upload the fonts and icons to LittleFS (must set at least 1M for LittleFS) using the
     19 //  "Tools"  "ESP8266 LittleFS Data Upload" menu option in the IDE.
     20 //  To add this option follow instructions here for the ESP8266:
     21 //  https://github.com/earlephilhower/arduino-esp8266littlefs-plugin
     22 
     23 //  Close the IDE and open again to see the new menu option.
     24 
     25 // A processing sketch to create new fonts can be found in the Tools folder of TFT_eSPI
     26 // https://github.com/Bodmer/TFT_eSPI/tree/master/Tools/Create_Smooth_Font/Create_font
     27 
     28 // This sketch uses font files created from the Noto family of fonts:
     29 // https://www.google.com/get/noto/
     30 
     31 #define AA_FONT_SMALL "NotoSansBold15"
     32 #define AA_FONT_LARGE "NotoSansBold36"
     33 #define AA_FONT_MONO  "NotoSansMonoSCB20" // NotoSansMono-SemiCondensedBold 20pt
     34 
     35 // Font files are stored in Flash FS
     36 #include <FS.h>
     37 #include <LittleFS.h>
     38 #define FlashFS LittleFS
     39 
     40 #include <SPI.h>
     41 #include <TFT_eSPI.h>       // Hardware-specific library
     42 
     43 TFT_eSPI    tft = TFT_eSPI();
     44 TFT_eSprite spr = TFT_eSprite(&tft); // Sprite class needs to be invoked
     45 
     46 void setup(void) {
     47 
     48   Serial.begin(250000);
     49 
     50   tft.begin();
     51 
     52   tft.setRotation(1);
     53 
     54   spr.setColorDepth(16); // 16 bit colour needed to show antialiased fonts
     55 
     56   if (!LittleFS.begin()) {
     57     Serial.println("Flash FS initialisation failed!");
     58     while (1) yield(); // Stay here twiddling thumbs waiting
     59   }
     60   Serial.println("\n\Flash FS available!");
     61 
     62   bool font_missing = false;
     63   if (LittleFS.exists("/NotoSansBold15.vlw")    == false) font_missing = true;
     64   if (LittleFS.exists("/NotoSansBold36.vlw")    == false) font_missing = true;
     65   if (LittleFS.exists("/NotoSansMonoSCB20.vlw") == false) font_missing = true;
     66 
     67   if (font_missing)
     68   {
     69     Serial.println("\nFont missing in Flash FS, did you upload it?");
     70     while(1) yield();
     71   }
     72   else Serial.println("\nFonts found OK.");
     73 }
     74 
     75 void loop() {
     76 
     77   tft.fillScreen(TFT_DARKGREY);
     78 
     79   int xpos = tft.width() / 2; // Half the screen width
     80   int ypos = 50;
     81 
     82 
     83   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     84   // Small font
     85   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     86 
     87   spr.loadFont(AA_FONT_SMALL, LittleFS); // Must load the font first into the sprite class
     88 
     89   spr.createSprite(100, 50);   // Create a sprite 100 pixels wide and 50 high
     90 
     91   spr.fillSprite(TFT_BLUE);
     92 
     93   spr.drawRect(0, 0, 100, 50, TFT_WHITE); // Draw sprite border outline (so we see extent)
     94 
     95   spr.setTextColor(TFT_YELLOW, TFT_DARKGREY); // Set the sprite font colour and the background colour
     96 
     97   spr.setTextDatum(MC_DATUM); // Middle Centre datum
     98   
     99   spr.drawString("15pt font", 50, 25 ); // Coords of middle of 100 x 50 Sprite
    100 
    101   spr.pushSprite(10, 10); // Push to TFT screen coord 10, 10
    102 
    103   spr.pushSprite(10, 70, TFT_BLUE); // Push to TFT screen, TFT_BLUE is transparent
    104  
    105   spr.unloadFont(); // Remove the font from sprite class to recover memory used
    106 
    107   delay(4000);
    108 
    109   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    110   // Large font
    111   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    112 
    113   tft.fillScreen(TFT_BLACK);
    114 
    115   // Beware: Sprites are a different "class" to TFT, so different fonts can be loaded
    116   // in the tft and sprite instances, so load the font in the class instance you use!
    117   // In this example this means the spr. instance.
    118 
    119   spr.loadFont(AA_FONT_LARGE, LittleFS); // Load another different font into the sprite instance
    120 
    121   // 100 x 50 sprite was created above and still exists...
    122 
    123   spr.fillSprite(TFT_GREEN);
    124 
    125   spr.setTextColor(TFT_BLACK, TFT_GREEN); // Set the font colour and the background colour
    126 
    127   spr.setTextDatum(MC_DATUM); // Middle Centre datum
    128 
    129   spr.drawString("Fits", 50, 25); // Make sure text fits in the Sprite!
    130   spr.pushSprite(10, 10);         // Push to TFT screen coord 10, 10
    131 
    132   spr.fillSprite(TFT_RED);
    133   spr.setTextColor(TFT_WHITE, TFT_RED); // Set the font colour and the background colour
    134 
    135   spr.drawString("Too big", 50, 25); // Text is too big to all fit in the Sprite!
    136   spr.pushSprite(10, 70);            // Push to TFT screen coord 10, 70
    137 
    138   // Draw changing numbers - no flicker using this plot method!
    139 
    140   // >>>> Note: it is best to use drawNumber() and drawFloat() for numeric values <<<<
    141   // >>>> this reduces digit position movement when the value changes             <<<<
    142   // >>>> drawNumber() and drawFloat() functions behave like drawString() and are <<<<
    143   // >>>> supported by setTextDatum() and setTextPadding()                        <<<<
    144 
    145   spr.setTextDatum(TC_DATUM); // Top Centre datum
    146 
    147   spr.setTextColor(TFT_WHITE, TFT_BLUE); // Set the font colour and the background colour
    148 
    149   for (int i = 0; i <= 200; i++) {
    150     spr.fillSprite(TFT_BLUE);
    151     spr.drawFloat(i / 100.0, 2, 50, 10); // draw with 2 decimal places at 50,10 in sprite
    152     spr.pushSprite(10, 130); // Push to TFT screen coord 10, 130
    153     delay (20);
    154   }
    155 
    156   spr.unloadFont(); // Remove the font to recover memory used
    157 
    158   spr.deleteSprite(); // Recover memory
    159   
    160   delay(1000);
    161 
    162   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    163   // Mono spaced font
    164   // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    165   
    166   spr.loadFont(AA_FONT_MONO, LittleFS); // Mono spaced fonts have fixed inter-character gaps to
    167                               // aid formatting
    168   int bnum = 1;
    169 
    170   // Example of drawing buttons
    171   for (int j = 0; j < 4; j++)
    172   {
    173     for (int k = 0; k < 4; k++)
    174     {
    175       int x = 120 + k * 45;
    176       int y = 40  + j * 30;
    177       button(x, y, bnum++);
    178     }
    179   }
    180 
    181   for (int i = 0; i < 100; i++)
    182   {
    183     button(120, 160, i);
    184     delay(50);
    185   }
    186   
    187   spr.unloadFont();
    188 
    189   delay(8000);
    190 }
    191 
    192 // #########################################################################
    193 // Draw a number in a rounded rectangle with some transparent pixels
    194 // Load the font before calling
    195 // #########################################################################
    196 void button(int x, int y, int num )
    197 {
    198 
    199   // Size of sprite
    200   #define IWIDTH  40
    201   #define IHEIGHT 25
    202 
    203   // Create a 16 bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed)
    204   spr.setColorDepth(16);
    205   spr.createSprite(IWIDTH, IHEIGHT);
    206 
    207   // Fill it with black (this will be the transparent colour this time)
    208   spr.fillSprite(TFT_BLACK);
    209 
    210   // Draw a background for the numbers
    211   spr.fillRoundRect(  0, 0,  IWIDTH, IHEIGHT, 8, TFT_RED);
    212   spr.drawRoundRect(  0, 0,  IWIDTH, IHEIGHT, 8, TFT_WHITE);
    213 
    214   // Set the font parameters
    215 
    216   // Set text coordinate datum to middle centre
    217   spr.setTextDatum(MC_DATUM);
    218 
    219   // Set the font colour and the background colour
    220   spr.setTextColor(TFT_WHITE, TFT_RED);
    221 
    222   // Draw the number
    223   spr.drawNumber(num, IWIDTH/2, 1 + IHEIGHT/2);
    224 
    225   // Push sprite to TFT screen CGRAM at coordinate x,y (top left corner)
    226   // All black pixels will not be drawn hence will show as "transparent"
    227   spr.pushSprite(x, y, TFT_BLACK);
    228 
    229   // Delete sprite to free up the RAM
    230   spr.deleteSprite();
    231 }