#!/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 #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 data awk -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"