Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
Shell
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889#!/bin/bash# bdf-to-c.sh — Convert a BDF font file to a C header with embedded glyph data# Usage: ./bdf-to-c.sh input.bdf > output.h## Extracts ASCII glyphs (32-126) with variable-width support.
set -euo pipefail
BDF="$1"FONT_NAME="${2:-bdf_font}"
cat << EOF// Auto-generated from $(basename "$BDF") — do not edit// Generated by bdf-to-c.sh
#ifndef AC_FONT_${FONT_NAME^^}_H#define AC_FONT_${FONT_NAME^^}_H
#include <stdint.h>
#define ${FONT_NAME^^}_MAX_W 16#define ${FONT_NAME^^}_MAX_H 16
typedef struct { uint8_t width; // glyph pixel width (BBX w) uint8_t height; // glyph pixel height (BBX h) int8_t xoff; // x offset from origin int8_t yoff; // y offset from baseline uint8_t dwidth; // advance width (device width) uint8_t rows[${FONT_NAME^^}_MAX_H]; // bitmap rows (MSB = leftmost pixel)} BDFGlyph;
EOF
# Parse BDF and emit glyph dataawk -v name="$FONT_NAME" 'BEGIN { font_ascent = 8 max_h = 0}
/^FONT_ASCENT / { font_ascent = $2 }
/^STARTCHAR / { char_name = $2; in_char = 1; in_bitmap = 0; row_idx = 0 }/^ENCODING / { encoding = $2 }/^DWIDTH / { dwidth = $2 }/^BBX / { bbx_w = $2; bbx_h = $3; bbx_xoff = $4; bbx_yoff = $5; if (bbx_h > max_h) max_h = bbx_h }/^BITMAP$/ { in_bitmap = 1; next }/^ENDCHAR/ { if (encoding >= 32 && encoding <= 126) { glyphs[encoding] = 1 g_w[encoding] = bbx_w g_h[encoding] = bbx_h g_xoff[encoding] = bbx_xoff g_yoff[encoding] = bbx_yoff g_dw[encoding] = dwidth g_rows[encoding] = row_idx for (r = 0; r < row_idx; r++) { g_data[encoding, r] = rows[r] } } in_char = 0; in_bitmap = 0}
in_bitmap && in_char { rows[row_idx++] = "0x" $0}
END { printf "static const int %s_ascent = %d;\n\n", name, font_ascent printf "static const BDFGlyph %s_glyphs[95] = {\n", name for (enc = 32; enc <= 126; enc++) { if (enc in glyphs) { printf " // %c (%d) — %dpx wide\n", enc, enc, g_w[enc] printf " {%d, %d, %d, %d, %d, {", g_w[enc], g_h[enc], g_xoff[enc], g_yoff[enc], g_dw[enc] for (r = 0; r < g_rows[enc]; r++) { if (r > 0) printf ", " printf "%s", g_data[enc, r] } printf "}},\n" } else { printf " // (missing %d)\n {0, 0, 0, 0, 4, {0}},\n", enc } } printf "};\n\n" printf "#endif\n"}' "$BDF"