From 1f83087aa5e522a486918cad13dbfa5f9edaac28 Mon Sep 17 00:00:00 2001 From: Hoang Manh Linh Date: Thu, 11 Jun 2026 19:11:50 +0700 Subject: [PATCH] feat(fonts): add Vietnamese glyph coverage to the built-in UI font (#2280) Co-authored-by: Claude Opus 4.8 (1M context) --- .../source/Ubuntu/Ubuntu-Vietnamese-Bold.ttf | Bin 0 -> 7960 bytes .../Ubuntu/Ubuntu-Vietnamese-Regular.ttf | Bin 0 -> 7888 bytes lib/EpdFont/builtinFonts/ubuntu_10_bold.h | 595 +++++++++++---- lib/EpdFont/builtinFonts/ubuntu_10_regular.h | 458 ++++++++--- lib/EpdFont/builtinFonts/ubuntu_12_bold.h | 716 +++++++++++++----- lib/EpdFont/builtinFonts/ubuntu_12_regular.h | 673 +++++++++++----- lib/EpdFont/scripts/convert-builtin-fonts.sh | 7 +- 7 files changed, 1823 insertions(+), 626 deletions(-) create mode 100644 lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Bold.ttf create mode 100644 lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Regular.ttf diff --git a/lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Bold.ttf b/lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2fcab561c7b7eb283ea7879a519b42a2a1c8e5a3 GIT binary patch literal 7960 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 I$p~8Xzge;z*#H0l literal 0 HcmV?d00001 diff --git a/lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Regular.ttf b/lib/EpdFont/builtinFonts/source/Ubuntu/Ubuntu-Vietnamese-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1a5e4a25b60d6bada9f96cbe4e9233ce2228c507 GIT binary patch literal 7888 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 $output_path echo "Generated $output_path" done