Files
OpenEPaperLink/miscellaneous/render_bitmapfonts/render_bitmapfonts.pde
2025-02-16 15:41:32 +01:00

130 lines
4.1 KiB
Plaintext

import java.awt.Desktop;
int curY = 0;
PFont myFont;
PrintWriter logOutput;
void setup() {
size(1200, 1000);
boolean smooth = true;
boolean crisp = false;
curY = 0;
int[] unicodeBlocks = {
0x0021, 0x007E, //Basic Latin, 128, 128, Latin (52 characters), Common (76 characters)
0x0080, 0x00FF, //Latin-1 Supplement, 128, 128, Latin (64 characters), Common (64 characters)
0x0100, 0x017F, //Latin Extended-A, 128, 128, Latin
0x0180, 0x024F, //Latin Extended-B, 208, 208, Latin
//0x0250, 0x02AF, //IPA Extensions, 96, 96, Latin
//0x02B0, 0x02FF, //Spacing Modifier Letters, 80, 80, Bopomofo (2 characters), Latin (14 characters), Common (64 characters)
//0x0030, 0x0039, //Example custom range (numbers 0-9)
//0x0041, 0x005A, //Example custom range (Upper case A-Z)
//0x0061, 0x007A, //Example custom range (Lower case a-z)
//0xF000, 0xF0FF, //weather font
};
int blockCount = unicodeBlocks.length;
int firstUnicode = 0;
int lastUnicode = 0;
char[] charset;
int index = 0, count = 0;
for (int i = 0; i < blockCount; i+=2) {
firstUnicode = unicodeBlocks[i];
lastUnicode = unicodeBlocks[i+1];
if (lastUnicode < firstUnicode) {
delay(100);
System.err.println("ERROR: Bad Unicode range secified, last < first!");
System.err.print("first in range = 0x" + hex(firstUnicode, 4));
System.err.println(", last in range = 0x" + hex(lastUnicode, 4));
while (true);
}
count += (lastUnicode - firstUnicode + 1);
}
charset = new char[count];
for (int i = 0; i < blockCount; i+=2) {
firstUnicode = unicodeBlocks[i];
lastUnicode = unicodeBlocks[i+1];
for (int code = firstUnicode; code <= lastUnicode; code++) {
charset[index] = Character.toChars(code)[0];
index++;
}
}
String str = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_abcdefghijklmnopqrstuvwxyz{|}~°ÄÅÆÖØÚÜßáäåæéíöøúüýąČěľłńŘřŚŠź";
char[] charsetbasic = str.toCharArray();
str = "ABCDEFGHIJKLMNOPQRSTUVWXYZminortzÁÅÄÖØÚČŚŠ0123456789-";
char[] charsetdaynames = str.toCharArray();
str = "0123456789.°-";
char[] charsetnumbers = str.toCharArray();
createAndSaveFont("twcondensed", ".ttf", charsetdaynames, 20, crisp);
createAndSaveFont("bahnschrift", ".ttf", charsetbasic, 20, crisp);
createAndSaveFont("bahnschrift", ".ttf", charsetbasic, 30, crisp);
createAndSaveFont("bahnschrift", ".ttf", charsetnumbers, 70, crisp);
createAndSaveFont("calibrib", ".ttf", charsetbasic, 30, crisp);
createAndSaveFont("calibrib", ".ttf", charset, 16, crisp);
createAndSaveFont("REFSAN", ".ttf", charset, 12, crisp);
createAndSaveFont("tahoma", ".ttf", charset, 9, crisp);
try {
String path = sketchPath();
Desktop.getDesktop().open(new File(path+"/FontFiles"));
}
catch(IOException e) {
println("Failed to create the file");
}
}
void createAndSaveFont(String fontName, String fontType, char charset[], int fontSize, boolean smooth) {
int displayFontSize = fontSize;
myFont = createFont(fontName+fontType, displayFontSize, smooth, charset);
fill(0, 0, 0);
textFont(myFont);
int gapx = displayFontSize*10/8;
int gapy = displayFontSize*10/8;
int index = 0;
fill(0);
textSize(displayFontSize);
curY += gapy;
for (int y = curY; y < height-gapy; y += gapy) {
int x = 10;
curY = y;
while (x < width) {
int unicode = charset[index];
float cwidth = textWidth((char)unicode) + 2;
if ( (x + cwidth) > (width - gapx) ) break;
text(new String(Character.toChars(unicode)), x, y);
x += cwidth;
index++;
if (index >= charset.length) break;
}
if (index >= charset.length) break;
}
PFont font;
font = createFont(fontName + fontType, fontSize, smooth, charset);
println("Created font " + fontName + str(fontSize) + ".vlw");
try {
print("Saving to sketch FontFiles folder... ");
OutputStream output = createOutput("FontFiles/" + fontName + str(fontSize) + ".vlw");
font.save(output);
output.close();
println("OK!");
delay(100);
}
catch (IOException e) {
println("Doh! Failed to create the file");
}
}