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;
+};