mirror of
https://github.com/m5stack/FontCreator.git
synced 2026-05-20 10:27:07 -07:00
Update
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
if use PlatformIO, need add "board_build.partitions = no_ota.csv" to config
|
||||
Set tools->partition scheme->'Large APP'
|
||||
Pls modify <m5stack path>/src/utility/In_eSPI_Setup.h, At the end of the file add "#define USE_M5_FONT_CREATOR"
|
||||
if want get customize unicode, try use https://github.com/m5stack/FontCreator, create font file
|
||||
|
||||
if add "#define USE_M5_FONT_CREATOR" and want to use standard gfx font, need modify font file
|
||||
#ifdef USE_M5_FONT_CREATOR
|
||||
0, 0,
|
||||
#endif
|
||||
like:
|
||||
const GFXfont FreeMono12pt7b PROGMEM = {
|
||||
(uint8_t *)FreeMono12pt7bBitmaps,
|
||||
(GFXglyph *)FreeMono12pt7bGlyphs,
|
||||
0x20, 0x7E, 24,
|
||||
#ifdef USE_M5_FONT_CREATOR
|
||||
0, 0,
|
||||
#endif
|
||||
};
|
||||
*/
|
||||
#include <M5Stack.h>
|
||||
#include "test_24px_24px.h"
|
||||
|
||||
void setup()
|
||||
{
|
||||
M5.begin();
|
||||
|
||||
M5.Lcd.setTextColor(TFT_WHITE);
|
||||
M5.Lcd.setFreeFont(&test_24px_24px);
|
||||
M5.Lcd.setTextDatum(TC_DATUM);
|
||||
|
||||
M5.Lcd.fillScreen(0);
|
||||
M5.Lcd.drawString("Hello world", 160, 30, 1);
|
||||
M5.Lcd.drawString("你好 世界", 160, 60, 1);
|
||||
M5.Lcd.drawString("Здравствуй мир", 160, 90, 1);
|
||||
M5.Lcd.drawString("こんにちは せかい", 160, 120, 1);
|
||||
M5.Lcd.drawString("日本語行ける!?╰(●’◡’●)╮", 160, 150, 1);
|
||||
M5.Lcd.drawString("(ฅ´ω`ฅ) ヾ(*´▽‘*)ノ (っ °Д °;)っ", 160, 180, 1);
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
|
||||
}
|
||||
+76219
File diff suppressed because it is too large
Load Diff
+2240
-2240
File diff suppressed because it is too large
Load Diff
+527
-527
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
@@ -1,3 +1,7 @@
|
||||
# GFX Font Creator
|
||||
|
||||
## Usage
|
||||
|
||||
This software is used to generate GFX fonts.
|
||||
In order to support the discrete unicode block index, the font generated by the software has modified the font format to reduce the size.
|
||||
Support for multiple unicode blocks with different fonts.
|
||||
@@ -8,10 +12,36 @@ You can adjust the offset in preview window.
|
||||
|
||||

|
||||
|
||||
usage:
|
||||
setp 1. Add -> Select font (Selecting the font size on this page is invalid, please set it in step 2) -> enter unicode block range (with Hexadecimal) -> OK
|
||||
step 2. Set font size (pixel)
|
||||
step 3. Enter a custom font name
|
||||
step 4. Gerenate
|
||||
## Step
|
||||
|
||||
*Generation takes a few minutes, during which the software may become unresponsive, but the program does not crash. Please wait for it to complete. You can see that the size of the font file is getting bigger and bigger.
|
||||
1. Add -> Select font (font size on this page is invalid, please set it in step 2) -> enter unicode block range (with Hexadecimal) or load from json file -> OK
|
||||
2. Set font size (pixel)
|
||||
3. Enter a custom font name
|
||||
4. Gerenate
|
||||
|
||||
## Files
|
||||
|
||||
### 'unicode2gfx.py'
|
||||
|
||||
- Command line version without GUI
|
||||
|
||||
### ./Unicode
|
||||
|
||||
- Unicode example
|
||||
- You can load the JSON file through the GUI to generate the specified Unicode block
|
||||
|
||||
### ./GUI/GFXCreator.py
|
||||
|
||||
- GUI Version
|
||||
|
||||
### ./GUI/GFXCreator_Smooth.py
|
||||
|
||||
- GUI Version that generate 2bit anti-aliased font
|
||||
|
||||
### ./GUI/GFXCreator.fbp
|
||||
|
||||
- GUI framework project. (wxpython)
|
||||
|
||||
### ./GUI/GFXCreator.exe
|
||||
|
||||
- Compiled executable file (not anti-aliasing)
|
||||
|
||||
File diff suppressed because one or more lines are too long
+20452
File diff suppressed because it is too large
Load Diff
+411
@@ -0,0 +1,411 @@
|
||||
# By icyqwq@gmail.com
|
||||
# This script converts the unicode.bin font file to a GFX font
|
||||
# Please try to select consecutive Unicode blocks, otherwise it will waste a lot of memory.
|
||||
'''
|
||||
import sys
|
||||
import math
|
||||
import re
|
||||
from PIL import Image
|
||||
from PIL import ImageFont, ImageDraw
|
||||
|
||||
font = ImageFont.truetype("YuGothB.ttc", 30)
|
||||
|
||||
mask = font.getmask(u"啊啊啊", mode='1')
|
||||
|
||||
size = mask.size
|
||||
print(size)
|
||||
for y in (range(0, size[1])):
|
||||
for x in (range(0, size[0])):
|
||||
#print("%3d " %mask.getpixel((x, y)), end = "")
|
||||
|
||||
if mask.getpixel((x, y)) == 255:
|
||||
print("■", end = "")
|
||||
else:
|
||||
print(" ", end = "")
|
||||
|
||||
print("")
|
||||
exit("done")
|
||||
'''
|
||||
import sys
|
||||
import math
|
||||
import re
|
||||
|
||||
UNICODE_BLOCK = []
|
||||
|
||||
# Please select the required block here, or customize the block
|
||||
# For more details on characters, please refer to https://unicode-table.com/cn/
|
||||
UNICODE_BLOCK.append((0x0000, 0x001F)) # Control character
|
||||
UNICODE_BLOCK.append((0x0020, 0x007F)) # Basic Latin
|
||||
#UNICODE_BLOCK.append((0x0080, 0x00FF)) # Latin-1 Supplement
|
||||
#UNICODE_BLOCK.append((0x0100, 0x017F)) # Latin Extended-A
|
||||
#UNICODE_BLOCK.append((0x0180, 0x024F)) # Latin Extended-B
|
||||
#UNICODE_BLOCK.append((0x0250, 0x02AF)) # IPA Extensions
|
||||
#UNICODE_BLOCK.append((0x02B0, 0x02FF)) # Spacing Modifier Letters
|
||||
#UNICODE_BLOCK.append((0x0300, 0x036F)) # Combining Diacritical Marks
|
||||
#UNICODE_BLOCK.append((0x0370, 0x03FF)) # Greek and Coptic
|
||||
#UNICODE_BLOCK.append((0x0400, 0x04FF)) # Cyrillic
|
||||
#UNICODE_BLOCK.append((0x0500, 0x052F)) # Cyrillic Supplement
|
||||
#UNICODE_BLOCK.append((0x0530, 0x058F)) # Armenian
|
||||
#UNICODE_BLOCK.append((0x0590, 0x05FF)) # Hebrew
|
||||
#UNICODE_BLOCK.append((0x0600, 0x06FF)) # Arabic
|
||||
#UNICODE_BLOCK.append((0x0700, 0x074F)) # Syriac
|
||||
#UNICODE_BLOCK.append((0x0750, 0x077F)) # Arabic Supplement
|
||||
#UNICODE_BLOCK.append((0x0780, 0x07BF)) # Thaana
|
||||
#UNICODE_BLOCK.append((0x07C0, 0x07FF)) # NKo
|
||||
#UNICODE_BLOCK.append((0x0800, 0x083F)) # Samaritan
|
||||
#UNICODE_BLOCK.append((0x0840, 0x085F)) # Mandaic
|
||||
#UNICODE_BLOCK.append((0x0860, 0x086F)) # Syriac Supplement
|
||||
#UNICODE_BLOCK.append((0x08A0, 0x08FF)) # Arabic Extended-A
|
||||
#UNICODE_BLOCK.append((0x0900, 0x097F)) # Devanagari
|
||||
#UNICODE_BLOCK.append((0x0980, 0x09FF)) # Bengali
|
||||
#UNICODE_BLOCK.append((0x0A00, 0x0A7F)) # Gurmukhi
|
||||
#UNICODE_BLOCK.append((0x0A80, 0x0AFF)) # Gujarati
|
||||
#UNICODE_BLOCK.append((0x0B00, 0x0B7F)) # Oriya
|
||||
#UNICODE_BLOCK.append((0x0B80, 0x0BFF)) # Tamil
|
||||
#UNICODE_BLOCK.append((0x0C00, 0x0C7F)) # Telugu
|
||||
#UNICODE_BLOCK.append((0x0C80, 0x0CFF)) # Kannada
|
||||
#UNICODE_BLOCK.append((0x0D00, 0x0D7F)) # Malayalam
|
||||
#UNICODE_BLOCK.append((0x0D80, 0x0DFF)) # Sinhala
|
||||
#UNICODE_BLOCK.append((0x0E00, 0x0E7F)) # Thai
|
||||
#UNICODE_BLOCK.append((0x0E80, 0x0EFF)) # Lao
|
||||
#UNICODE_BLOCK.append((0x0F00, 0x0FFF)) # Tibetan
|
||||
#UNICODE_BLOCK.append((0x1000, 0x109F)) # Myanmar
|
||||
#UNICODE_BLOCK.append((0x10A0, 0x10FF)) # Georgian
|
||||
#UNICODE_BLOCK.append((0x1100, 0x11FF)) # Hangul Jamo
|
||||
#UNICODE_BLOCK.append((0x1200, 0x137F)) # Ethiopic
|
||||
#UNICODE_BLOCK.append((0x1380, 0x139F)) # Ethiopic Supplement
|
||||
#UNICODE_BLOCK.append((0x13A0, 0x13FF)) # Cherokee
|
||||
#UNICODE_BLOCK.append((0x1400, 0x167F)) # Unified Canadian Aboriginal Syllabics
|
||||
#UNICODE_BLOCK.append((0x1680, 0x169F)) # Ogham
|
||||
#UNICODE_BLOCK.append((0x16A0, 0x16FF)) # Runic
|
||||
#UNICODE_BLOCK.append((0x1700, 0x171F)) # Tagalog
|
||||
#UNICODE_BLOCK.append((0x1720, 0x173F)) # Hanunoo
|
||||
#UNICODE_BLOCK.append((0x1740, 0x175F)) # Buhid
|
||||
#UNICODE_BLOCK.append((0x1760, 0x177F)) # Tagbanwa
|
||||
#UNICODE_BLOCK.append((0x1780, 0x17FF)) # Khmer
|
||||
#UNICODE_BLOCK.append((0x1800, 0x18AF)) # Mongolian
|
||||
#UNICODE_BLOCK.append((0x18B0, 0x18FF)) # Unified Canadian Aboriginal Syllabics Extended
|
||||
#UNICODE_BLOCK.append((0x1900, 0x194F)) # Limbu
|
||||
#UNICODE_BLOCK.append((0x1950, 0x197F)) # Tai Le
|
||||
#UNICODE_BLOCK.append((0x1980, 0x19DF)) # New Tai Lue
|
||||
#UNICODE_BLOCK.append((0x19E0, 0x19FF)) # Khmer Symbols
|
||||
#UNICODE_BLOCK.append((0x1A00, 0x1A1F)) # Buginese
|
||||
#UNICODE_BLOCK.append((0x1A20, 0x1AAF)) # Tai Tham
|
||||
#UNICODE_BLOCK.append((0x1AB0, 0x1AFF)) # Combining Diacritical Marks Extended
|
||||
#UNICODE_BLOCK.append((0x1B00, 0x1B7F)) # Balinese
|
||||
#UNICODE_BLOCK.append((0x1B80, 0x1BBF)) # Sundanese
|
||||
#UNICODE_BLOCK.append((0x1BC0, 0x1BFF)) # Batak
|
||||
#UNICODE_BLOCK.append((0x1C00, 0x1C4F)) # Lepcha
|
||||
#UNICODE_BLOCK.append((0x1C50, 0x1C7F)) # Ol Chiki
|
||||
#UNICODE_BLOCK.append((0x1C80, 0x1C8F)) # Cyrillic Extended C
|
||||
#UNICODE_BLOCK.append((0x1CC0, 0x1CCF)) # Sundanese Supplement
|
||||
#UNICODE_BLOCK.append((0x1CD0, 0x1CFF)) # Vedic Extensions
|
||||
#UNICODE_BLOCK.append((0x1D00, 0x1D7F)) # Phonetic Extensions
|
||||
#UNICODE_BLOCK.append((0x1D80, 0x1DBF)) # Phonetic Extensions Supplement
|
||||
#UNICODE_BLOCK.append((0x1DC0, 0x1DFF)) # Combining Diacritical Marks Supplement
|
||||
#UNICODE_BLOCK.append((0x1E00, 0x1EFF)) # Latin Extended Additional
|
||||
#UNICODE_BLOCK.append((0x1F00, 0x1FFF)) # Greek Extended
|
||||
#UNICODE_BLOCK.append((0x2000, 0x206F)) # General Punctuation
|
||||
#UNICODE_BLOCK.append((0x2070, 0x209F)) # Superscripts and Subscripts
|
||||
#UNICODE_BLOCK.append((0x20A0, 0x20CF)) # Currency Symbols
|
||||
#UNICODE_BLOCK.append((0x20D0, 0x20FF)) # Combining Diacritical Marks for Symbols
|
||||
#UNICODE_BLOCK.append((0x2100, 0x214F)) # Letterlike Symbols
|
||||
#UNICODE_BLOCK.append((0x2150, 0x218F)) # Number Forms
|
||||
#UNICODE_BLOCK.append((0x2190, 0x21FF)) # Arrows
|
||||
#UNICODE_BLOCK.append((0x2200, 0x22FF)) # Mathematical Operators
|
||||
#UNICODE_BLOCK.append((0x2300, 0x23FF)) # Miscellaneous Technical
|
||||
#UNICODE_BLOCK.append((0x2400, 0x243F)) # Control Pictures
|
||||
#UNICODE_BLOCK.append((0x2440, 0x245F)) # Optical Character Recognition
|
||||
#UNICODE_BLOCK.append((0x2460, 0x24FF)) # Enclosed Alphanumerics
|
||||
#UNICODE_BLOCK.append((0x2500, 0x257F)) # Box Drawing
|
||||
#UNICODE_BLOCK.append((0x2580, 0x259F)) # Block Elements
|
||||
#UNICODE_BLOCK.append((0x25A0, 0x25FF)) # Geometric Shapes
|
||||
#UNICODE_BLOCK.append((0x2600, 0x26FF)) # Miscellaneous Symbols
|
||||
#UNICODE_BLOCK.append((0x2700, 0x27BF)) # Dingbats
|
||||
#UNICODE_BLOCK.append((0x27C0, 0x27EF)) # Miscellaneous Mathematical Symbols-A
|
||||
#UNICODE_BLOCK.append((0x27F0, 0x27FF)) # Supplemental Arrows-A
|
||||
#UNICODE_BLOCK.append((0x2800, 0x28FF)) # Braille Patterns
|
||||
#UNICODE_BLOCK.append((0x2900, 0x297F)) # Supplemental Arrows-B
|
||||
#UNICODE_BLOCK.append((0x2980, 0x29FF)) # Miscellaneous Mathematical Symbols-B
|
||||
#UNICODE_BLOCK.append((0x2A00, 0x2AFF)) # Supplemental Mathematical Operators
|
||||
#UNICODE_BLOCK.append((0x2B00, 0x2BFF)) # Miscellaneous Symbols and Arrows
|
||||
#UNICODE_BLOCK.append((0x2C00, 0x2C5F)) # Glagolitic
|
||||
#UNICODE_BLOCK.append((0x2C60, 0x2C7F)) # Latin Extended-C
|
||||
#UNICODE_BLOCK.append((0x2C80, 0x2CFF)) # Coptic
|
||||
#UNICODE_BLOCK.append((0x2D00, 0x2D2F)) # Georgian Supplement
|
||||
#UNICODE_BLOCK.append((0x2D30, 0x2D7F)) # Tifinagh
|
||||
#UNICODE_BLOCK.append((0x2D80, 0x2DDF)) # Ethiopic Extended
|
||||
#UNICODE_BLOCK.append((0x2DE0, 0x2DFF)) # Cyrillic Extended-A
|
||||
#UNICODE_BLOCK.append((0x2E00, 0x2E7F)) # Supplemental Punctuation
|
||||
#UNICODE_BLOCK.append((0x2E80, 0x2EFF)) # CJK Radicals Supplement
|
||||
#UNICODE_BLOCK.append((0x2F00, 0x2FDF)) # Kangxi Radicals
|
||||
#UNICODE_BLOCK.append((0x2FF0, 0x2FFF)) # Ideographic Description Characters
|
||||
#UNICODE_BLOCK.append((0x3000, 0x303F)) # CJK Symbols and Punctuation
|
||||
UNICODE_BLOCK.append((0x3040, 0x309F)) # Hiragana
|
||||
UNICODE_BLOCK.append((0x30A0, 0x30FF)) # Katakana
|
||||
#UNICODE_BLOCK.append((0x3100, 0x312F)) # Bopomofo
|
||||
#UNICODE_BLOCK.append((0x3130, 0x318F)) # Hangul Compatibility Jamo
|
||||
#UNICODE_BLOCK.append((0x3190, 0x319F)) # Kanbun
|
||||
#UNICODE_BLOCK.append((0x31A0, 0x31BF)) # Bopomofo Extended
|
||||
#UNICODE_BLOCK.append((0x31C0, 0x31EF)) # CJK Strokes
|
||||
#UNICODE_BLOCK.append((0x31F0, 0x31FF)) # Katakana Phonetic Extensions
|
||||
#UNICODE_BLOCK.append((0x3200, 0x32FF)) # Enclosed CJK Letters and Months
|
||||
#UNICODE_BLOCK.append((0x3300, 0x33FF)) # CJK Compatibility
|
||||
#UNICODE_BLOCK.append((0x3400, 0x4DBF)) # CJK Unified Ideographs Extension A
|
||||
#UNICODE_BLOCK.append((0x4DC0, 0x4DFF)) # Yijing Hexagram Symbols
|
||||
#UNICODE_BLOCK.append((0x4E00, 0x9FFF)) # CJK Unified Ideographs
|
||||
#UNICODE_BLOCK.append((0xA000, 0xA48F)) # Yi Syllables
|
||||
#UNICODE_BLOCK.append((0xA490, 0xA4CF)) # Yi Radicals
|
||||
#UNICODE_BLOCK.append((0xA4D0, 0xA4FF)) # Lisu
|
||||
#UNICODE_BLOCK.append((0xA500, 0xA63F)) # Vai
|
||||
#UNICODE_BLOCK.append((0xA640, 0xA69F)) # Cyrillic Extended-B
|
||||
#UNICODE_BLOCK.append((0xA6A0, 0xA6FF)) # Bamum
|
||||
#UNICODE_BLOCK.append((0xA700, 0xA71F)) # Modifier Tone Letters
|
||||
#UNICODE_BLOCK.append((0xA720, 0xA7FF)) # Latin Extended-D
|
||||
#UNICODE_BLOCK.append((0xA800, 0xA82F)) # Syloti Nagri
|
||||
#UNICODE_BLOCK.append((0xA830, 0xA83F)) # Common Indic Number Forms
|
||||
#UNICODE_BLOCK.append((0xA840, 0xA87F)) # Phags-pa
|
||||
#UNICODE_BLOCK.append((0xA880, 0xA8DF)) # Saurashtra
|
||||
#UNICODE_BLOCK.append((0xA8E0, 0xA8FF)) # Devanagari Extended
|
||||
#UNICODE_BLOCK.append((0xA900, 0xA92F)) # Kayah Li
|
||||
#UNICODE_BLOCK.append((0xA930, 0xA95F)) # Rejang
|
||||
#UNICODE_BLOCK.append((0xA960, 0xA97F)) # Hangul Jamo Extended-A
|
||||
#UNICODE_BLOCK.append((0xA980, 0xA9DF)) # Javanese
|
||||
#UNICODE_BLOCK.append((0xA9E0, 0xA9FF)) # Myanmar Extended-B
|
||||
#UNICODE_BLOCK.append((0xAA00, 0xAA5F)) # Cham
|
||||
#UNICODE_BLOCK.append((0xAA60, 0xAA7F)) # Myanmar Extended-A
|
||||
#UNICODE_BLOCK.append((0xAA80, 0xAADF)) # Tai Viet
|
||||
#UNICODE_BLOCK.append((0xAAE0, 0xAAFF)) # Meetei Mayek Extensions
|
||||
#UNICODE_BLOCK.append((0xAB00, 0xAB2F)) # Ethiopic Extended-A
|
||||
#UNICODE_BLOCK.append((0xAB30, 0xAB6F)) # Latin Extended-E
|
||||
#UNICODE_BLOCK.append((0xAB70, 0xABBF)) # Cherokee Supplement
|
||||
#UNICODE_BLOCK.append((0xABC0, 0xABFF)) # Meetei Mayek
|
||||
#UNICODE_BLOCK.append((0xAC00, 0xD7AF)) # Hangul Syllables
|
||||
#UNICODE_BLOCK.append((0xD7B0, 0xD7FF)) # Hangul Jamo Extended-B
|
||||
#UNICODE_BLOCK.append((0xD800, 0xDB7F)) # High Surrogates
|
||||
#UNICODE_BLOCK.append((0xDB80, 0xDBFF)) # High Private Use Surrogates
|
||||
#UNICODE_BLOCK.append((0xDC00, 0xDFFF)) # Low Surrogates
|
||||
#UNICODE_BLOCK.append((0xE000, 0xF8FF)) # Private Use Area
|
||||
#UNICODE_BLOCK.append((0xF900, 0xFAFF)) # CJK Compatibility Ideographs
|
||||
#UNICODE_BLOCK.append((0xFB00, 0xFB4F)) # Alphabetic Presentation Forms
|
||||
#UNICODE_BLOCK.append((0xFB50, 0xFDFF)) # Arabic Presentation Forms-A
|
||||
#UNICODE_BLOCK.append((0xFE00, 0xFE0F)) # Variation Selectors
|
||||
#UNICODE_BLOCK.append((0xFE10, 0xFE1F)) # Vertical Forms
|
||||
#UNICODE_BLOCK.append((0xFE20, 0xFE2F)) # Combining Half Marks
|
||||
#UNICODE_BLOCK.append((0xFE30, 0xFE4F)) # CJK Compatibility Forms
|
||||
#UNICODE_BLOCK.append((0xFE50, 0xFE6F)) # Small Form Variants
|
||||
#UNICODE_BLOCK.append((0xFE70, 0xFEFF)) # Arabic Presentation Forms-B
|
||||
#UNICODE_BLOCK.append((0xFF00, 0xFFEF)) # Halfwidth and Fullwidth Forms
|
||||
#UNICODE_BLOCK.append((0xFFF0, 0xFFFF)) # Specials
|
||||
|
||||
def MergeUnicodeBlock():
|
||||
global UNICODE_BLOCK
|
||||
block = []
|
||||
start = 0
|
||||
flag = True
|
||||
for i in range(0, len(UNICODE_BLOCK)-1):
|
||||
if flag == True:
|
||||
flag = False
|
||||
start = UNICODE_BLOCK[i][0]
|
||||
if UNICODE_BLOCK[i][1] + 1 == UNICODE_BLOCK[i+1][0]:
|
||||
continue
|
||||
else:
|
||||
flag = True
|
||||
block.append((start, UNICODE_BLOCK[i][1]))
|
||||
block.append((start, UNICODE_BLOCK[i+1][1]))
|
||||
for x in block:
|
||||
print("%04X %04X" %(x[0], x[1]))
|
||||
|
||||
UNICODE_BLOCK = block
|
||||
|
||||
def GetBitmap(unicode):
|
||||
global fonts
|
||||
fonts.seek(CHARACTER_ADDR_BASE * unicode, 0)
|
||||
bitmap = []
|
||||
for x in range(0, CHARACTER_SIZE):
|
||||
bitmap.append(bin(int(fonts.read(CHARACTER_BYTES).hex(), 16)).replace('0b', '').rjust(CHARACTER_BYTES * 8, '0'))
|
||||
|
||||
width = 0
|
||||
x_start = 999
|
||||
x_end = 0
|
||||
y_start = 999
|
||||
y_end = 0
|
||||
for line in range(0, CHARACTER_SIZE):
|
||||
lfind = bitmap[line].find('1')
|
||||
if lfind >= 0:
|
||||
y_end = line
|
||||
if y_start == 999:
|
||||
y_start = line
|
||||
if lfind < x_start:
|
||||
x_start = lfind
|
||||
rfind = bitmap[line].rfind('1')
|
||||
if rfind > x_end:
|
||||
x_end = rfind
|
||||
if x_start > x_end:
|
||||
width = 0
|
||||
else:
|
||||
width = x_end - x_start + 1
|
||||
|
||||
if y_start > y_end:
|
||||
height = 0
|
||||
else:
|
||||
height = y_end - y_start + 1
|
||||
|
||||
x_offset = XGAP
|
||||
y_offset = CHARACTER_SIZE - y_start
|
||||
|
||||
valid_bitmap = []
|
||||
for y in range(y_start, y_end + 1):
|
||||
valid_bitmap.append(bitmap[y][x_start : x_end + 1])
|
||||
|
||||
fullbinstr = ''
|
||||
for line in valid_bitmap:
|
||||
fullbinstr += line
|
||||
|
||||
hex_bitmap = []
|
||||
if len(valid_bitmap):
|
||||
nbyte = math.ceil(len(fullbinstr) / 8.0)
|
||||
fullbinstr.ljust(nbyte * 8, '0')
|
||||
for n in range(nbyte):
|
||||
hex_bitmap.append("0x%02X" %int(fullbinstr[n*8 : (n+1)*8], 2))
|
||||
|
||||
if unicode == 0x0020:
|
||||
return [[], [], CHARACTER_SIZE/2, 0, CHARACTER_SIZE/2, 0, 0, unicode]
|
||||
if width == 0 or height == 0:
|
||||
return [[], [], 0, 0, 0, 0, 0, unicode]
|
||||
return [hex_bitmap, valid_bitmap, width, height, width+XGAP*2, XGAP, -y_offset, unicode]
|
||||
|
||||
def DisplayBitmap(attributes):
|
||||
print("Width: %d Heigth: %d xAdvance: %d xOffset: %d yOffset: %d" %(attributes[2], attributes[3], attributes[4], attributes[5], attributes[6]))
|
||||
s = ' '
|
||||
for i in range(0, attributes[2]):
|
||||
s += '| '
|
||||
print(s)
|
||||
for x in range(0, len(attributes[1])):
|
||||
print('%-2d' %x, end=' ')
|
||||
for y in attributes[1][x]:
|
||||
if(y == '1'):
|
||||
print('■ ', end='')
|
||||
else:
|
||||
print(' ', end='')
|
||||
print('')
|
||||
|
||||
def isInBlock(unicode):
|
||||
for block in UNICODE_BLOCK:
|
||||
if unicode >= block[0] and unicode <= block[1]:
|
||||
return True
|
||||
return False
|
||||
|
||||
MergeUnicodeBlock()
|
||||
CHARACTER_SIZE = 16
|
||||
XGAP = 1
|
||||
|
||||
try:
|
||||
m = re.search('(\w+)', sys.argv[1])
|
||||
filename = m.group(1)
|
||||
except:
|
||||
exit('Please specify the correct file name')
|
||||
|
||||
try:
|
||||
CHARACTER_SIZE = int(sys.argv[2])
|
||||
except:
|
||||
exit('Please specify the correct font size (px)')
|
||||
|
||||
try:
|
||||
XGAP = int(sys.argv[3])
|
||||
except:
|
||||
XGAP = 1
|
||||
print('Unspecified character spacing, using default spacing 1')
|
||||
|
||||
CHARACTER_BYTES = math.ceil(CHARACTER_SIZE / 8.0)
|
||||
CHARACTER_ADDR_BASE = CHARACTER_SIZE * CHARACTER_BYTES
|
||||
|
||||
print('Running...')
|
||||
|
||||
fonts = open(sys.argv[1], "rb+")
|
||||
dst = open("%s.h" %filename, "w")
|
||||
|
||||
|
||||
glyph_list = []
|
||||
for block in UNICODE_BLOCK :
|
||||
for unicode in range(block[0], block[1] + 1):
|
||||
glyph_list.append(GetBitmap(unicode))
|
||||
|
||||
dst.write('/* This file is automatically generated by a Unicode to GFX script */\n')
|
||||
dst.write('/* by icyqwq@gmail.com */\n\n')
|
||||
dst.write('#ifndef _%s_H_\n' %filename)
|
||||
dst.write('#define _%s_H_\n' %filename)
|
||||
dst.write('const uint8_t %sBitmaps[] PROGMEM = {\n' %filename)
|
||||
|
||||
size = 0
|
||||
x_cursor = 0
|
||||
for glyph in glyph_list:
|
||||
for hexstr in glyph[0]:
|
||||
dst.write('%s, ' %hexstr)
|
||||
size += 1
|
||||
x_cursor += 1
|
||||
if x_cursor == 10:
|
||||
x_cursor = 0
|
||||
dst.write('\n')
|
||||
x_cursor = 0
|
||||
dst.write('/* 0x%04X */\n' %glyph[7])
|
||||
dst.seek(dst.tell()-2)
|
||||
dst.write('};\n\n')
|
||||
|
||||
dst.write('/* bitmapOffset, width, height, xAdvance, xOffset, yOffset */\n')
|
||||
dst.write('const GFXglyph %sGlyphs[] PROGMEM = {\n' %filename)
|
||||
|
||||
base_list = []
|
||||
base_list.append(0)
|
||||
base = 0
|
||||
newrange_flag = False
|
||||
bitmap_offset = 0
|
||||
unicode_start = UNICODE_BLOCK[0][0]
|
||||
unicode_end = UNICODE_BLOCK[len(UNICODE_BLOCK)-1][1]
|
||||
glyph_index = 0
|
||||
waste_size = 6
|
||||
for unicode in range(unicode_start, unicode_end + 1):
|
||||
if isInBlock(unicode):
|
||||
newrange_flag = True
|
||||
base += 1
|
||||
glyph = glyph_list[glyph_index]
|
||||
glyph_index += 1
|
||||
dst.write('{0x%X, %d, %d, %d, %d, %d}, /* 0x%04X */\n' %(bitmap_offset, glyph[2], glyph[3], glyph[4], glyph[5], glyph[6], glyph[7]))
|
||||
bitmap_offset += len(glyph[0])
|
||||
size += 7
|
||||
else:
|
||||
if newrange_flag is True:
|
||||
waste_size += 6
|
||||
newrange_flag = False
|
||||
base_list.append(base)
|
||||
else:
|
||||
pass
|
||||
#print('Invalid Unicode 0x%04X' %unicode)
|
||||
#dst.write('{0, 0, 0, 0, 0, 0}, /* 0x%04X */\n' %(unicode))
|
||||
#waste_size += 7
|
||||
dst.seek(dst.tell()-16)
|
||||
dst.write('};/* 0x%04X */\n\n' %(unicode))
|
||||
size += waste_size
|
||||
|
||||
if len(UNICODE_BLOCK) is not len(base_list):
|
||||
print("Error %d != %d" %(len(UNICODE_BLOCK), len(base_list)))
|
||||
|
||||
dst.write('const EncodeRange %sEncodeRange[] PROGMEM = {\n' %filename)
|
||||
for i in range(0, len(UNICODE_BLOCK)):
|
||||
dst.write('{0x%04X, 0x%04X, 0x%04X},\n' %(UNICODE_BLOCK[i][0], UNICODE_BLOCK[i][1], base_list[i]))
|
||||
dst.seek(dst.tell()-3)
|
||||
dst.write('};\n\n')
|
||||
|
||||
dst.write('const GFXfont %s PROGMEM = {\n' %filename)
|
||||
dst.write('(uint8_t *) %sBitmaps,\n' %filename)
|
||||
dst.write('(GFXglyph *) %sGlyphs,\n' %filename)
|
||||
dst.write('0x%04X, 0x%04X, %d, ' %(unicode_start, unicode_end, CHARACTER_SIZE+XGAP))
|
||||
dst.write('%d,\n' %len(base_list))
|
||||
dst.write('(EncodeRange *) %sEncodeRange};\n\n' %filename)
|
||||
|
||||
dst.write('/* Approx. %.1f KiB (Waste %d Byte, Memory utilization %.2f%%) */\n\n' %(size/1024.0, waste_size, 100-(waste_size/size)*100))
|
||||
dst.write('#endif\n')
|
||||
|
||||
fonts.close()
|
||||
dst.close()
|
||||
exit('Generate successfully, Approx. %.1f KiB (Waste %d Byte, Memory utilization %.2f%%)' %(size/1024.0, waste_size, 100-(waste_size/size)*100))
|
||||
Reference in New Issue
Block a user