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

Create_font.pde (24593B)

      1 // This is a Processing sketch, see https://processing.org/ to download the IDE
      2 
      3 // Select the font, size and character ranges in the user configuration section
      4 // of this sketch, which starts at line 120. Instructions start at line 50.
      5 
      6 
      7 /*
      8 Software License Agreement (FreeBSD License)
      9  
     10  Copyright (c) 2018 Bodmer (https://github.com/Bodmer)
     11  
     12  All rights reserved.
     13  
     14  Redistribution and use in source and binary forms, with or without
     15  modification, are permitted provided that the following conditions are met:
     16  
     17  1. Redistributions of source code must retain the above copyright notice, this
     18  list of conditions and the following disclaimer.
     19  2. Redistributions in binary form must reproduce the above copyright notice,
     20  this list of conditions and the following disclaimer in the documentation
     21  and/or other materials provided with the distribution.
     22  
     23  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     24  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     25  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     26  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     27  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     28  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     29  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     30  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     31  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     32  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33  
     34  The views and conclusions contained in the software and documentation are those
     35  of the authors and should not be interpreted as representing official policies,
     36  either expressed or implied, of the FreeBSD Project.
     37  */
     38 
     39 ////////////////////////////////////////////////////////////////////////////////////////////////
     40 
     41 // This is a processing sketch to create font files for the TFT_eSPI library:
     42 
     43 // https://github.com/Bodmer/TFT_eSPI
     44 
     45 // Coded by Bodmer January 2018, updated 10/2/19
     46 // Version 0.8
     47 
     48 // >>>>>>>>>>>>>>>>>>>>             INSTRUCTIONS             <<<<<<<<<<<<<<<<<<<<
     49 
     50 // See comments below in code for specifying the font parameters (point size,
     51 // unicode blocks to include etc). Ranges of characters (glyphs) and specific
     52 // individual glyphs can be included in the created "*.vlw" font file.
     53 
     54 // Created fonts are saved in the sketches "FontFiles" folder. Press Ctrl+K to
     55 // see that folder location.
     56 
     57 // 16 bit Unicode point codes in the range 0x0000 - 0xFFFF are supported.
     58 // Codes 0-31 are control codes such as "tab" and "carraige return" etc.
     59 // and 32 is a "space", these should NOT be included.
     60 
     61 // The sketch will convert True Type (a .ttf or .otf file) file stored in the
     62 // sketches "Data" folder as well as your computers' system fonts.
     63 
     64 // To maximise rendering performance and the memory consumed only include the characters
     65 // you will use. Characters at the start of the file will render faster than those at
     66 // the end due to the buffering and file seeking overhead.
     67 
     68 // The inclusion of "non-existant" characters in a font may give unpredicatable results
     69 // when rendering with the TFT_eSPI library. The Processing sketch window that pops up
     70 // to show the font characters will print "boxes" (also known as Tofu!) for non existant
     71 // characters.
     72 
     73 // Once created the files must be loaded into the ESP32 or ESP8266 SPIFFS memory
     74 // using the Arduino IDE plugin detailed here:
     75 // https://github.com/esp8266/arduino-esp8266fs-plugin
     76 // https://github.com/me-no-dev/arduino-esp32fs-plugin
     77 
     78 // When the sketch is run it will generate a file called "System_Font_List.txt" in the
     79 // sketch "FontFiles" folder, press Ctrl+K to see it. Open the file in a text editor to
     80 // view it. This list provides the font reference number needed below to locate that
     81 // font on your system.
     82 
     83 // The sketch also lists all the available system fonts to the console, you can increase
     84 // the console line count (in preferences.txt) to stop some fonts scrolling out of view.
     85 // See link in File>Preferences to locate "preferences.txt" file. You must close
     86 // Processing then edit the file lines. If Processing is not closed first then the
     87 // edits will be overwritten by defaults! Edit "preferences.txt" as follows for
     88 // 3000 lines, then save, then run Processing again:
     89 
     90 //     console.length=3000;             // Line 4 in file
     91 //     console.scrollback.lines=3000;   // Line 7 in file
     92 
     93 
     94 // Useful links:
     95 /*
     96 
     97  https://en.wikipedia.org/wiki/Unicode_font
     98  
     99  https://www.gnu.org/software/freefont/
    100  https://www.gnu.org/software/freefont/sources/
    101  https://www.gnu.org/software/freefont/ranges/
    102  http://savannah.gnu.org/projects/freefont/
    103  
    104  http://www.google.com/get/noto/
    105  
    106  https://github.com/Bodmer/TFT_eSPI
    107  https://github.com/esp8266/arduino-esp8266fs-plugin
    108  https://github.com/me-no-dev/arduino-esp32fs-plugin
    109  
    110    >>>>>>>>>>>>>>>>>>>>         END OF INSTRUCTIONS         <<<<<<<<<<<<<<<<<<<< */
    111 
    112 
    113 import java.awt.Desktop; // Required to allow sketch to open file windows
    114 
    115 
    116 ////////////////////////////////////////////////////////////////////////////////////////////////
    117 
    118 //                       >>>>>>>>>> USER CONFIGURED PARAMETERS START HERE <<<<<<<<<<
    119 
    120 // Use font number or name, -1 for fontNumber means use fontName below, a value >=0 means use system font number from list.
    121 // When the sketch is run it will generate a file called "systemFontList.txt" in the sketch folder, press Ctrl+K to see it.
    122 // Open the "systemFontList.txt" in a text editor to view the font files and reference numbers for your system.
    123 
    124 int fontNumber = -1; // << Use [Number] in brackets from the fonts listed.
    125 
    126 // OR use font name for ttf files placed in the "Data" folder or the font number seen in IDE Console for system fonts
    127 //                                                  the font numbers are listed when the sketch is run.
    128 //                |         1         2     |       Maximum filename size for SPIFFS is 31 including leading /
    129 //                 1234567890123456789012345        and added point size and .vlw extension, so max is 25
    130 String fontName = "Final-Frontier";  // Manually crop the filename length later after creation if needed
    131                                      // Note: SPIFFS does NOT accept underscore in a filename!
    132 String fontType = ".ttf";
    133 //String fontType = ".otf";
    134 
    135 
    136 // Define the font size in points for the TFT_eSPI font file
    137 int  fontSize = 20;
    138 
    139 // Font size to use in the Processing sketch display window that pops up (can be different to above)
    140 int displayFontSize = 28;
    141 
    142 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    143 // Next we specify which unicode blocks from the the Basic Multilingual Plane (BMP) are included in the final font file. //
    144 // Note: The ttf/otf font file MAY NOT contain all possible Unicode characters, refer to the fonts online documentation. //
    145 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    146 
    147 static final int[] unicodeBlocks = {
    148   // The list below has been created from the table here: https://en.wikipedia.org/wiki/Unicode_block
    149   // Remove // at start of lines below to include that unicode block, different code ranges can also be specified by
    150   // editing the start and end-of-range values. Multiple lines from the list below can be included, limited only by
    151   // the final font file size!
    152 
    153   // Block range,   //Block name, Code points, Assigned characters, Scripts
    154   // First, last,   //Range is inclusive of first and last codes
    155   0x0021, 0x007E, //Basic Latin, 128, 128, Latin (52 characters), Common (76 characters)
    156   //0x0080, 0x00FF, //Latin-1 Supplement, 128, 128, Latin (64 characters), Common (64 characters)
    157   //0x0100, 0x017F, //Latin Extended-A, 128, 128, Latin
    158   //0x0180, 0x024F, //Latin Extended-B, 208, 208, Latin
    159   //0x0250, 0x02AF, //IPA Extensions, 96, 96, Latin
    160   //0x02B0, 0x02FF, //Spacing Modifier Letters, 80, 80, Bopomofo (2 characters), Latin (14 characters), Common (64 characters)
    161   //0x0300, 0x036F, //Combining Diacritical Marks, 112, 112, Inherited
    162   //0x0370, 0x03FF, //Greek and Coptic, 144, 135, Coptic (14 characters), Greek (117 characters), Common (4 characters)
    163   //0x0400, 0x04FF, //Cyrillic, 256, 256, Cyrillic (254 characters), Inherited (2 characters)
    164   //0x0500, 0x052F, //Cyrillic Supplement, 48, 48, Cyrillic
    165   //0x0530, 0x058F, //Armenian, 96, 89, Armenian (88 characters), Common (1 character)
    166   //0x0590, 0x05FF, //Hebrew, 112, 87, Hebrew
    167   //0x0600, 0x06FF, //Arabic, 256, 255, Arabic (237 characters), Common (6 characters), Inherited (12 characters)
    168   //0x0700, 0x074F, //Syriac, 80, 77, Syriac
    169   //0x0750, 0x077F, //Arabic Supplement, 48, 48, Arabic
    170   //0x0780, 0x07BF, //Thaana, 64, 50, Thaana
    171   //0x07C0, 0x07FF, //NKo, 64, 59, Nko
    172   //0x0800, 0x083F, //Samaritan, 64, 61, Samaritan
    173   //0x0840, 0x085F, //Mandaic, 32, 29, Mandaic
    174   //0x0860, 0x086F, //Syriac Supplement, 16, 11, Syriac
    175   //0x08A0, 0x08FF, //Arabic Extended-A, 96, 73, Arabic (72 characters), Common (1 character)
    176   //0x0900, 0x097F, //Devanagari, 128, 128, Devanagari (124 characters), Common (2 characters), Inherited (2 characters)
    177   //0x0980, 0x09FF, //Bengali, 128, 95, Bengali
    178   //0x0A00, 0x0A7F, //Gurmukhi, 128, 79, Gurmukhi
    179   //0x0A80, 0x0AFF, //Gujarati, 128, 91, Gujarati
    180   //0x0B00, 0x0B7F, //Oriya, 128, 90, Oriya
    181   //0x0B80, 0x0BFF, //Tamil, 128, 72, Tamil
    182   //0x0C00, 0x0C7F, //Telugu, 128, 96, Telugu
    183   //0x0C80, 0x0CFF, //Kannada, 128, 88, Kannada
    184   //0x0D00, 0x0D7F, //Malayalam, 128, 117, Malayalam
    185   //0x0D80, 0x0DFF, //Sinhala, 128, 90, Sinhala
    186   //0x0E00, 0x0E7F, //Thai, 128, 87, Thai (86 characters), Common (1 character)
    187   //0x0E80, 0x0EFF, //Lao, 128, 67, Lao
    188   //0x0F00, 0x0FFF, //Tibetan, 256, 211, Tibetan (207 characters), Common (4 characters)
    189   //0x1000, 0x109F, //Myanmar, 160, 160, Myanmar
    190   //0x10A0, 0x10FF, //Georgian, 96, 88, Georgian (87 characters), Common (1 character)
    191   //0x1100, 0x11FF, //Hangul Jamo, 256, 256, Hangul
    192   //0x1200, 0x137F, //Ethiopic, 384, 358, Ethiopic
    193   //0x1380, 0x139F, //Ethiopic Supplement, 32, 26, Ethiopic
    194   //0x13A0, 0x13FF, //Cherokee, 96, 92, Cherokee
    195   //0x1400, 0x167F, //Unified Canadian Aboriginal Syllabics, 640, 640, Canadian Aboriginal
    196   //0x1680, 0x169F, //Ogham, 32, 29, Ogham
    197   //0x16A0, 0x16FF, //Runic, 96, 89, Runic (86 characters), Common (3 characters)
    198   //0x1700, 0x171F, //Tagalog, 32, 20, Tagalog
    199   //0x1720, 0x173F, //Hanunoo, 32, 23, Hanunoo (21 characters), Common (2 characters)
    200   //0x1740, 0x175F, //Buhid, 32, 20, Buhid
    201   //0x1760, 0x177F, //Tagbanwa, 32, 18, Tagbanwa
    202   //0x1780, 0x17FF, //Khmer, 128, 114, Khmer
    203   //0x1800, 0x18AF, //Mongolian, 176, 156, Mongolian (153 characters), Common (3 characters)
    204   //0x18B0, 0x18FF, //Unified Canadian Aboriginal Syllabics Extended, 80, 70, Canadian Aboriginal
    205   //0x1900, 0x194F, //Limbu, 80, 68, Limbu
    206   //0x1950, 0x197F, //Tai Le, 48, 35, Tai Le
    207   //0x1980, 0x19DF, //New Tai Lue, 96, 83, New Tai Lue
    208   //0x19E0, 0x19FF, //Khmer Symbols, 32, 32, Khmer
    209   //0x1A00, 0x1A1F, //Buginese, 32, 30, Buginese
    210   //0x1A20, 0x1AAF, //Tai Tham, 144, 127, Tai Tham
    211   //0x1AB0, 0x1AFF, //Combining Diacritical Marks Extended, 80, 15, Inherited
    212   //0x1B00, 0x1B7F, //Balinese, 128, 121, Balinese
    213   //0x1B80, 0x1BBF, //Sundanese, 64, 64, Sundanese
    214   //0x1BC0, 0x1BFF, //Batak, 64, 56, Batak
    215   //0x1C00, 0x1C4F, //Lepcha, 80, 74, Lepcha
    216   //0x1C50, 0x1C7F, //Ol Chiki, 48, 48, Ol Chiki
    217   //0x1C80, 0x1C8F, //Cyrillic Extended-C, 16, 9, Cyrillic
    218   //0x1CC0, 0x1CCF, //Sundanese Supplement, 16, 8, Sundanese
    219   //0x1CD0, 0x1CFF, //Vedic Extensions, 48, 42, Common (15 characters), Inherited (27 characters)
    220   //0x1D00, 0x1D7F, //Phonetic Extensions, 128, 128, Cyrillic (2 characters), Greek (15 characters), Latin (111 characters)
    221   //0x1D80, 0x1DBF, //Phonetic Extensions Supplement, 64, 64, Greek (1 character), Latin (63 characters)
    222   //0x1DC0, 0x1DFF, //Combining Diacritical Marks Supplement, 64, 63, Inherited
    223   //0x1E00, 0x1EFF, //Latin Extended Additional, 256, 256, Latin
    224   //0x1F00, 0x1FFF, //Greek Extended, 256, 233, Greek
    225   //0x2000, 0x206F, //General Punctuation, 112, 111, Common (109 characters), Inherited (2 characters)
    226   //0x2070, 0x209F, //Superscripts and Subscripts, 48, 42, Latin (15 characters), Common (27 characters)
    227   //0x20A0, 0x20CF, //Currency Symbols, 48, 32, Common
    228   //0x20D0, 0x20FF, //Combining Diacritical Marks for Symbols, 48, 33, Inherited
    229   //0x2100, 0x214F, //Letterlike Symbols, 80, 80, Greek (1 character), Latin (4 characters), Common (75 characters)
    230   //0x2150, 0x218F, //Number Forms, 64, 60, Latin (41 characters), Common (19 characters)
    231   //0x2190, 0x21FF, //Arrows, 112, 112, Common
    232   //0x2200, 0x22FF, //Mathematical Operators, 256, 256, Common
    233   //0x2300, 0x23FF, //Miscellaneous Technical, 256, 256, Common
    234   //0x2400, 0x243F, //Control Pictures, 64, 39, Common
    235   //0x2440, 0x245F, //Optical Character Recognition, 32, 11, Common
    236   //0x2460, 0x24FF, //Enclosed Alphanumerics, 160, 160, Common
    237   //0x2500, 0x257F, //Box Drawing, 128, 128, Common
    238   //0x2580, 0x259F, //Block Elements, 32, 32, Common
    239   //0x25A0, 0x25FF, //Geometric Shapes, 96, 96, Common
    240   //0x2600, 0x26FF, //Miscellaneous Symbols, 256, 256, Common
    241   //0x2700, 0x27BF, //Dingbats, 192, 192, Common
    242   //0x27C0, 0x27EF, //Miscellaneous Mathematical Symbols-A, 48, 48, Common
    243   //0x27F0, 0x27FF, //Supplemental Arrows-A, 16, 16, Common
    244   //0x2800, 0x28FF, //Braille Patterns, 256, 256, Braille
    245   //0x2900, 0x297F, //Supplemental Arrows-B, 128, 128, Common
    246   //0x2980, 0x29FF, //Miscellaneous Mathematical Symbols-B, 128, 128, Common
    247   //0x2A00, 0x2AFF, //Supplemental Mathematical Operators, 256, 256, Common
    248   //0x2B00, 0x2BFF, //Miscellaneous Symbols and Arrows, 256, 207, Common
    249   //0x2C00, 0x2C5F, //Glagolitic, 96, 94, Glagolitic
    250   //0x2C60, 0x2C7F, //Latin Extended-C, 32, 32, Latin
    251   //0x2C80, 0x2CFF, //Coptic, 128, 123, Coptic
    252   //0x2D00, 0x2D2F, //Georgian Supplement, 48, 40, Georgian
    253   //0x2D30, 0x2D7F, //Tifinagh, 80, 59, Tifinagh
    254   //0x2D80, 0x2DDF, //Ethiopic Extended, 96, 79, Ethiopic
    255   //0x2DE0, 0x2DFF, //Cyrillic Extended-A, 32, 32, Cyrillic
    256   //0x2E00, 0x2E7F, //Supplemental Punctuation, 128, 74, Common
    257   //0x2E80, 0x2EFF, //CJK Radicals Supplement, 128, 115, Han
    258   //0x2F00, 0x2FDF, //Kangxi Radicals, 224, 214, Han
    259   //0x2FF0, 0x2FFF, //Ideographic Description Characters, 16, 12, Common
    260   //0x3000, 0x303F, //CJK Symbols and Punctuation, 64, 64, Han (15 characters), Hangul (2 characters), Common (43 characters), Inherited (4 characters)
    261   //0x3040, 0x309F, //Hiragana, 96, 93, Hiragana (89 characters), Common (2 characters), Inherited (2 characters)
    262   //0x30A0, 0x30FF, //Katakana, 96, 96, Katakana (93 characters), Common (3 characters)
    263   //0x3100, 0x312F, //Bopomofo, 48, 42, Bopomofo
    264   //0x3130, 0x318F, //Hangul Compatibility Jamo, 96, 94, Hangul
    265   //0x3190, 0x319F, //Kanbun, 16, 16, Common
    266   //0x31A0, 0x31BF, //Bopomofo Extended, 32, 27, Bopomofo
    267   //0x31C0, 0x31EF, //CJK Strokes, 48, 36, Common
    268   //0x31F0, 0x31FF, //Katakana Phonetic Extensions, 16, 16, Katakana
    269   //0x3200, 0x32FF, //Enclosed CJK Letters and Months, 256, 254, Hangul (62 characters), Katakana (47 characters), Common (145 characters)
    270   //0x3300, 0x33FF, //CJK Compatibility, 256, 256, Katakana (88 characters), Common (168 characters)
    271   //0x3400, 0x4DBF, //CJK Unified Ideographs Extension A, 6,592, 6,582, Han
    272   //0x4DC0, 0x4DFF, //Yijing Hexagram Symbols, 64, 64, Common
    273   //0x4E00, 0x9FFF, //CJK Unified Ideographs, 20,992, 20,971, Han
    274   //0xA000, 0xA48F, //Yi Syllables, 1,168, 1,165, Yi
    275   //0xA490, 0xA4CF, //Yi Radicals, 64, 55, Yi
    276   //0xA4D0, 0xA4FF, //Lisu, 48, 48, Lisu
    277   //0xA500, 0xA63F, //Vai, 320, 300, Vai
    278   //0xA640, 0xA69F, //Cyrillic Extended-B, 96, 96, Cyrillic
    279   //0xA6A0, 0xA6FF, //Bamum, 96, 88, Bamum
    280   //0xA700, 0xA71F, //Modifier Tone Letters, 32, 32, Common
    281   //0xA720, 0xA7FF, //Latin Extended-D, 224, 160, Latin (155 characters), Common (5 characters)
    282   //0xA800, 0xA82F, //Syloti Nagri, 48, 44, Syloti Nagri
    283   //0xA830, 0xA83F, //Common Indic Number Forms, 16, 10, Common
    284   //0xA840, 0xA87F, //Phags-pa, 64, 56, Phags Pa
    285   //0xA880, 0xA8DF, //Saurashtra, 96, 82, Saurashtra
    286   //0xA8E0, 0xA8FF, //Devanagari Extended, 32, 30, Devanagari
    287   //0xA900, 0xA92F, //Kayah Li, 48, 48, Kayah Li (47 characters), Common (1 character)
    288   //0xA930, 0xA95F, //Rejang, 48, 37, Rejang
    289   //0xA960, 0xA97F, //Hangul Jamo Extended-A, 32, 29, Hangul
    290   //0xA980, 0xA9DF, //Javanese, 96, 91, Javanese (90 characters), Common (1 character)
    291   //0xA9E0, 0xA9FF, //Myanmar Extended-B, 32, 31, Myanmar
    292   //0xAA00, 0xAA5F, //Cham, 96, 83, Cham
    293   //0xAA60, 0xAA7F, //Myanmar Extended-A, 32, 32, Myanmar
    294   //0xAA80, 0xAADF, //Tai Viet, 96, 72, Tai Viet
    295   //0xAAE0, 0xAAFF, //Meetei Mayek Extensions, 32, 23, Meetei Mayek
    296   //0xAB00, 0xAB2F, //Ethiopic Extended-A, 48, 32, Ethiopic
    297   //0xAB30, 0xAB6F, //Latin Extended-E, 64, 54, Latin (52 characters), Greek (1 character), Common (1 character)
    298   //0xAB70, 0xABBF, //Cherokee Supplement, 80, 80, Cherokee
    299   //0xABC0, 0xABFF, //Meetei Mayek, 64, 56, Meetei Mayek
    300   //0xAC00, 0xD7AF, //Hangul Syllables, 11,184, 11,172, Hangul
    301   //0xD7B0, 0xD7FF, //Hangul Jamo Extended-B, 80, 72, Hangul
    302   //0xD800, 0xDB7F, //High Surrogates, 896, 0, Unknown
    303   //0xDB80, 0xDBFF, //High Private Use Surrogates, 128, 0, Unknown
    304   //0xDC00, 0xDFFF, //Low Surrogates, 1,024, 0, Unknown
    305   //0xE000, 0xF8FF, //Private Use Area, 6,400, 6,400, Unknown
    306   //0xF900, 0xFAFF, //CJK Compatibility Ideographs, 512, 472, Han
    307   //0xFB00, 0xFB4F, //Alphabetic Presentation Forms, 80, 58, Armenian (5 characters), Hebrew (46 characters), Latin (7 characters)
    308   //0xFB50, 0xFDFF, //Arabic Presentation Forms-A, 688, 611, Arabic (609 characters), Common (2 characters)
    309   //0xFE00, 0xFE0F, //Variation Selectors, 16, 16, Inherited
    310   //0xFE10, 0xFE1F, //Vertical Forms, 16, 10, Common
    311   //0xFE20, 0xFE2F, //Combining Half Marks, 16, 16, Cyrillic (2 characters), Inherited (14 characters)
    312   //0xFE30, 0xFE4F, //CJK Compatibility Forms, 32, 32, Common
    313   //0xFE50, 0xFE6F, //Small Form Variants, 32, 26, Common
    314   //0xFE70, 0xFEFF, //Arabic Presentation Forms-B, 144, 141, Arabic (140 characters), Common (1 character)
    315   //0xFF00, 0xFFEF, //Halfwidth and Fullwidth Forms, 240, 225, Hangul (52 characters), Katakana (55 characters), Latin (52 characters), Common (66 characters)
    316   //0xFFF0, 0xFFFF, //Specials, 16, 5, Common
    317 
    318   //0x0030, 0x0039, //Example custom range (numbers 0-9)
    319   //0x0041, 0x005A, //Example custom range (Upper case A-Z)
    320   //0x0061, 0x007A, //Example custom range (Lower case a-z)
    321 };
    322 
    323 // Here we specify particular individual Unicodes to be included (appended at end of selected range)
    324 static final int[] specificUnicodes = {
    325 
    326   // Commonly used codes, add or remove // in next line
    327   // 0x00A3, 0x00B0, 0x00B5, 0x03A9, 0x20AC, // £ ° µ Ω €
    328 
    329   // Numbers and characters for showing time, change next line to //* to use
    330 /*
    331     0x002B, 0x002D, 0x002E, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, // - + . 0 1 2 3 4
    332     0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x0061, 0x006D, // 5 6 7 8 9 : a m
    333     0x0070,                                                         // p
    334  //*/
    335 
    336   // More characters for TFT_eSPI test sketches, change next line to //* to use
    337   /*
    338     0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x010C, 0x010D,
    339     0x010E, 0x010F, 0x0110, 0x0111, 0x0118, 0x0119, 0x011A, 0x011B,
    340  
    341     0x0131, 0x0139, 0x013A, 0x013D, 0x013E, 0x0141, 0x0142, 0x0143,
    342     0x0144, 0x0147, 0x0148, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154,
    343     0x0155, 0x0158, 0x0159, 0x015A, 0x015B, 0x015E, 0x015F, 0x0160,
    344     0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x016E, 0x016F, 0x0170,
    345     0x0171, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E,
    346     0x0192,
    347  
    348     0x02C6, 0x02C7, 0x02D8, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD,
    349     0x03A9, 0x03C0, 0x2013, 0x2014, 0x2018, 0x2019, 0x201A, 0x201C,
    350     0x201D, 0x201E, 0x2020, 0x2021, 0x2022, 0x2026, 0x2030, 0x2039,
    351     0x203A, 0x2044, 0x20AC,
    352  
    353     0x2122, 0x2202, 0x2206, 0x220F,
    354  
    355     0x2211, 0x221A, 0x221E, 0x222B, 0x2248, 0x2260, 0x2264, 0x2265,
    356     0x25CA,
    357  
    358     0xF8FF, 0xFB01, 0xFB02,
    359   //*/
    360 };
    361 
    362 //                       >>>>>>>>>> USER CONFIGURED PARAMETERS END HERE <<<<<<<<<<
    363 
    364 ////////////////////////////////////////////////////////////////////////////////////////////////
    365 
    366 // Variable to hold the inclusive Unicode range (16 bit values only for this sketch)
    367 int firstUnicode = 0;
    368 int lastUnicode  = 0;
    369 
    370 PFont myFont;
    371 
    372 PrintWriter logOutput;
    373 
    374 void setup() {
    375   logOutput = createWriter("FontFiles/System_Font_List.txt"); 
    376 
    377   size(1000, 800);
    378 
    379   // Print the available fonts to the console as a list:
    380   String[] fontList = PFont.list();
    381   printArray(fontList);
    382 
    383   // Save font list to file
    384   for (int x = 0; x < fontList.length; x++)
    385   {
    386     logOutput.print("[" + x + "] ");
    387     logOutput.println(fontList[x]);
    388   }
    389   logOutput.flush(); // Writes the remaining data to the file
    390   logOutput.close(); // Finishes the file
    391 
    392   // Set the fontName from the array number or the defined fontName
    393   if (fontNumber >= 0)
    394   {
    395     fontName = fontList[fontNumber];
    396     fontType = "";
    397   }
    398 
    399   char[]   charset;
    400   int  index = 0, count = 0;
    401 
    402   int blockCount = unicodeBlocks.length;
    403 
    404   for (int i = 0; i < blockCount; i+=2) {
    405     firstUnicode = unicodeBlocks[i];
    406     lastUnicode  = unicodeBlocks[i+1];
    407     if (lastUnicode < firstUnicode) {
    408       delay(100);
    409       System.err.println("ERROR: Bad Unicode range secified, last < first!");
    410       System.err.print("first in range = 0x" + hex(firstUnicode, 4));
    411       System.err.println(", last in range  = 0x" + hex(lastUnicode, 4));
    412       while (true);
    413     }
    414     // calculate the number of characters
    415     count += (lastUnicode - firstUnicode + 1);
    416   }
    417 
    418   count += specificUnicodes.length;
    419 
    420   println();
    421   println("=====================");
    422   println("Creating font file...");
    423   println("Unicode blocks included     = " + (blockCount/2));
    424   println("Specific unicodes included  = " + specificUnicodes.length);
    425   println("Total number of characters  = " + count);
    426 
    427   if (count == 0) {
    428     delay(100);
    429     System.err.println("ERROR: No Unicode range or specific codes have been defined!");
    430     while (true);
    431   }
    432 
    433   // allocate memory
    434   charset = new char[count];
    435 
    436   for (int i = 0; i < blockCount; i+=2) {
    437     firstUnicode = unicodeBlocks[i];
    438     lastUnicode  =  unicodeBlocks[i+1];
    439 
    440     // loading the range specified
    441     for (int code = firstUnicode; code <= lastUnicode; code++) {
    442       charset[index] = Character.toChars(code)[0];
    443       index++;
    444     }
    445   }
    446 
    447   // loading the specific point codes
    448   for (int i = 0; i < specificUnicodes.length; i++) {
    449     charset[index] = Character.toChars(specificUnicodes[i])[0];
    450     index++;
    451   }
    452 
    453   // Make font smooth (anti-aliased)
    454   boolean smooth = true;
    455 
    456   // Create the font in memory
    457   myFont = createFont(fontName+fontType, displayFontSize, smooth, charset);
    458 
    459   // Print characters to the sketch window
    460   fill(0, 0, 0);
    461   textFont(myFont);
    462 
    463   // Set the left and top margin
    464   int margin = displayFontSize;
    465   translate(margin/2, margin);
    466 
    467   int gapx = displayFontSize*10/8;
    468   int gapy = displayFontSize*10/8;
    469   index = 0;
    470   fill(0);
    471 
    472   textSize(displayFontSize);
    473 
    474   for (int y = 0; y < height-gapy; y += gapy) {
    475     int x = 0;
    476     while (x < width) {
    477 
    478       int unicode = charset[index];
    479       float cwidth = textWidth((char)unicode) + 2;
    480       if ( (x + cwidth) > (width - gapx) ) break;
    481 
    482       // Draw the glyph to the screen
    483       text(new String(Character.toChars(unicode)), x, y);
    484 
    485       // Move cursor
    486       x += cwidth;
    487       // Increment the counter
    488       index++;
    489       if (index >= count) break;
    490     }
    491     if (index >= count) break;
    492   }
    493 
    494 
    495   // creating font to save as a file
    496   PFont    font;
    497 
    498   font = createFont(fontName+fontType, fontSize, smooth, charset);
    499 
    500   println("Created font " + fontName + str(fontSize) + ".vlw");
    501 
    502   // creating file
    503   try {
    504     print("Saving to sketch FontFiles folder... ");
    505 
    506     OutputStream output = createOutput("FontFiles/" + fontName + str(fontSize) + ".vlw");
    507     font.save(output);
    508     output.close();
    509 
    510     println("OK!");
    511 
    512     delay(100);
    513 
    514     // Open up the FontFiles folder to access the saved file
    515     String path = sketchPath();
    516     Desktop.getDesktop().open(new File(path+"/FontFiles"));
    517 
    518     System.err.println("All done! Note: Rectangles are displayed for non-existant characters.");
    519   }
    520   catch(IOException e) {
    521     println("Doh! Failed to create the file");
    522   }
    523 }