问题:SDK 位图字库(meow_font)只有离散字号档位,全字形 atlas 稳态 17.3MiB (27MB 整机装不下)→ 大字库/大字号必出豆腐。阅读器 R1/R2 的 FreeType 管线已真机验证 (MiSans OTF),本 commit 将其上收 SDK,让任意 App 用上无级字号 + CJK 全字形。 设计(追加式,与位图字库并存): - meow_ui_ft.c(独立 .o):meow_ft_load/unload/loaded/text/width/line_height/ ascender/descender/cache_set_slots/cache_slots/cache_used。底层按 READER_ENGINE_NOTES §5: FT_New_Face(path) 按需读文件(零整载 anon);灰阶 FT_LOAD_RENDER|NO_HINTING|TARGET_LIGHT; glyph LRU key=(px<<32)|cp,默认 512(~0.46MB),可配 256/1024;测宽不栅格化。 - meow_ui_gfx.c 只加两个薄封装 meow_gfx_ft_blend_px/dirty(写 back_buf + 标脏), 使 meow_ui_ft.o 不引入新依赖——「不调 meow_ft_* 的 App 零增量」(freetype 不拉入,已验证)。 - 降级:加载失败/无卡 → meow_ft_loaded()==0 → meow_ft_text 自动改走 meow_ui_text(位图字库, 5x7 兜底),绝不豆腐不崩;meow_ft_width/line_height 降级位图字库度量。 - FreeType 2.14.3 vendor 进 patch_v2/sdk/vendor/(gitignore)+ build_sdk.sh 可复现拉取+裁剪 构建(-DFT_DISABLE_ZLIB/BZIP2/PNG/HARFBUZZ/BROTLI=TRUE,静态 musl),freetype .o 编入 meow_ui.a,App 链接命令不变(meow_ui.a libz.a -lpthread)。 验证: - 宿主 test_meow_ui_ft 5 项全 PASS(加载/渲染像素非空/宽度测量/LRU 淘汰/降级回退)。 - 全量 SDK 回归:widgets/sdk_fixes/dispatch/notif_gesture/overlay_suppress/listvirt/box/anim/ scroll/ime_fix/pinyin/notif_open/sb_collapse/theme/notify_ipc/audio_host/vol/str/config/ sdk_input_keys 全 PASS。 - 交叉 -Wall -Wextra 全 SDK TU 0 warning;qemu-mipsel 冒烟 PASS(mipsel FreeType 真光栅化)。 - meow_ui.a 新 md5 6ff5be9455f9e197b35fa120be012041(未重链不部署 App,四 App 免重链)。 MEOW_APP_SDK.md 补 §10.1 矢量字一节 + 公共头索引/§9 构建约定更新;.gitignore 忽略 patch_v2/sdk/vendor/ 与 test_meow_ui_ft 二进制。
70 lines
3.4 KiB
Bash
Executable File
70 lines
3.4 KiB
Bash
Executable File
#!/bin/bash
|
||
# build_sdk.sh — 构建 meow_ui.a(mipsel 静态库,含 meow_font.o 内联打包,
|
||
# 应用只需链 meow_ui.a + libz.a + -lpthread)。
|
||
#
|
||
# §10.1 矢量字:FreeType vendor 进 sdk/vendor/(gitignore),本脚本可复现「拉取 + 裁剪构建」:
|
||
# 禁 zlib/png/brotli/bzip2/harfbuzz(-DFT_DISABLE_*),静态 musl(zig-mipsel-cc);
|
||
# 产物 sdk/vendor/freetype-build/libfreetype.a,其 .o 编入 meow_ui.a —— 应用只链 meow_ui.a
|
||
# 即获得矢量字能力;不调 meow_ft_* 的 App 链接器不会拉取 freetype 成员(零增量)。
|
||
set -e
|
||
ROOT="$HOME/Project/R3ProII"
|
||
cd "$(dirname "$0")"
|
||
CC="$ROOT/.tools/zig-mipsel-cc"
|
||
AR="${AR:-/usr/bin/ar}" # 系统 GNU ar 即可归档 mipsel ELF 对象(架构无关)
|
||
|
||
# ---------- 0) FreeType vendor 拉取 + 裁剪构建(可复现) ----------
|
||
FT_VER="2.14.3"
|
||
FT_SRC="vendor/freetype-src"
|
||
FT_BUILD="vendor/freetype-build"
|
||
fetch_freetype() {
|
||
if [ -n "$SDK_FREETYPE_SRC" ] && [ -f "$SDK_FREETYPE_SRC/CMakeLists.txt" ]; then
|
||
rm -rf "$FT_SRC"; cp -r "$SDK_FREETYPE_SRC" "$FT_SRC"
|
||
elif [ ! -d "$FT_SRC" ]; then
|
||
mkdir -p vendor
|
||
( cd vendor && curl -fsSL -o ft.tar.xz \
|
||
"https://download.savannah.gnu.org/releases/freetype/freetype-$FT_VER.tar.xz" \
|
||
&& mkdir -p "$FT_SRC" && tar xf ft.tar.xz -C "$FT_SRC" --strip-components=1 && rm ft.tar.xz )
|
||
fi
|
||
[ -f "$FT_SRC/CMakeLists.txt" ] || { echo "freetype 源码不可用"; exit 1; }
|
||
}
|
||
fetch_freetype
|
||
if [ ! -f "$FT_BUILD/libfreetype.a" ] || [ -n "$FORCE_FT" ]; then
|
||
rm -rf "$FT_BUILD"
|
||
cmake -S "$FT_SRC" -B "$FT_BUILD" -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER="$CC" \
|
||
-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF \
|
||
-DFT_DISABLE_ZLIB=TRUE -DFT_DISABLE_BZIP2=TRUE -DFT_DISABLE_PNG=TRUE -DFT_DISABLE_HARFBUZZ=TRUE -DFT_DISABLE_BROTLI=TRUE >/dev/null
|
||
cmake --build "$FT_BUILD" -j"$(nproc)" >/dev/null 2>&1
|
||
fi
|
||
FT_INCS="-I$FT_BUILD -I$FT_BUILD/include -I$FT_SRC/include"
|
||
|
||
rm -f meow_ui.a *.o
|
||
|
||
# -I../meow_launcherd:meow_notify_ipc.c 复用共享协议头 meow_ipc.h(同一份、杜绝两端漂移)
|
||
OBJS="meow_ui_gfx meow_ui_log meow_ui_notify meow_notify_ipc meow_ui_img meow_ui_widget meow_ui_input meow_ui_theme meow_ui_ime meow_pinyin meow_ui_sys meow_ui_vol meow_ui_activity meow_ui_global meow_ui_dialog meow_ui_config meow_ui_draw meow_ui_view meow_ui_nav meow_ui_media meow_ui_audio stb_image meow_ui_box meow_ui_anim meow_ui_scroll meow_ui_str meow_ui_ft"
|
||
CFLAGS="-Os -static -I$ROOT/patch_v2/meow_launcherd"
|
||
for f in $OBJS; do
|
||
echo "== cc $f =="
|
||
"$CC" $CFLAGS $FT_INCS -c "$f.c" -o "$f.o"
|
||
done
|
||
|
||
# meow_font.o(复用 launcher 字库,打进 meow_ui.a → 应用只链一个库)
|
||
TMP="$(mktemp -d)"
|
||
( cd "$TMP" && "$AR" x "$ROOT/patch_v2/meow_launcherd/meow_font.a" && ls *.o )
|
||
cp "$TMP"/*.o meow_font.o 2>/dev/null || { echo "meow_font extract failed"; rm -rf "$TMP"; exit 1; }
|
||
rm -rf "$TMP"
|
||
|
||
rm -f meow_ui.a
|
||
for f in $OBJS; do "$AR" rcs meow_ui.a "$f.o"; done
|
||
"$AR" rcs meow_ui.a meow_font.o
|
||
|
||
# FreeType .o 编入 meow_ui.a(App 不调 meow_ft_* → 链接器不拉取,零增量)。
|
||
FT_LIB="$PWD/$FT_BUILD/libfreetype.a" # 绝对路径(待会 cd 进临时目录,相对路径会失效)
|
||
FT_O="$(mktemp -d)"
|
||
( cd "$FT_O" && "$AR" x "$FT_LIB" && ls *.o >/dev/null )
|
||
for o in "$FT_O"/*.o; do "$AR" rcs meow_ui.a "$o"; done
|
||
rm -rf "$FT_O"
|
||
|
||
echo "== meow_ui.a =="
|
||
ls -la meow_ui.a
|
||
"$AR" t meow_ui.a
|