painbrush

1.0.21.1.0
src/typography.js
+src/typography.jsNew file
+56
Index: package/src/typography.js
===================================================================
--- package/src/typography.js
+++ package/src/typography.js
@@ -0,0 +1,56 @@
+import { readFile } from "fs/promises";
+import path from "path";
+export const loadBuiltInFont = async () => {
+    return await useFont(readFile(path.resolve(import.meta.dirname, "./typography/poxel.pxfont")));
+};
+const unpackFontHandle = async (handle) => {
+    const file = await handle;
+    if (file instanceof Object && "alphabet" in file) {
+        return file;
+    }
+    return JSON.parse((await handle).toString());
+};
+export const useFont = async (handle) => {
+    const chars = await unpackFontHandle(handle);
+    const charmap = Object.fromEntries(chars.alphabet.split("").map((l, index) => {
+        const char = chars.characters[index];
+        return [
+            l,
+            {
+                isSingleChannel: true,
+                data: char[1],
+                width: char[0],
+                height: chars.metrics.height,
+            },
+        ];
+    }));
+    charmap[" "] = {
+        isSingleChannel: true,
+        data: [],
+        width: chars.metrics.spaces,
+        height: 0,
+    };
+    const getCharacterFromFont = (c) => {
+        if (c in charmap) {
+            return charmap[c];
+        }
+        const upper = c.toUpperCase();
+        if (upper in charmap) {
+            return charmap[upper];
+        }
+        const lower = c.toLowerCase();
+        if (lower in charmap) {
+            return charmap[lower];
+        }
+        return charmap[chars.alphabet[0]];
+    };
+    const FONT = {
+        getCharacter: (c) => {
+            return {
+                ...getCharacterFromFont(c),
+                id: Math.random(),
+            };
+        },
+    };
+    return FONT;
+};