- core: 编码检测(BOM→UTF-8严格→GB18030/Big5统计, Big5与GB重叠按GB18030兜底, §3.5风险注明) + GB18030双字节码表(uint16[126][190]=47880B, tools/gen_gb18030_table.py 生成, 生成物入仓) + 流式排版器(贪心断行+Kinsoku避头尾+分页+重排锚定, rd_meas_fn 测量回调替 FreeType, 宿主可测) + TXT 流式加载器(按段读, 不整文件入内存, \n 恒独立换行可安全分段) - engine: FreeType 封装(FT_New_Face 按需读文件, NO_HINTING/LIGHT 灰阶, LRU 512 key=码点+字号, blend565, rdft_advance 只测宽不栅格化) - app: 书架(扫 Books/ 识别 5 后缀, 最近读置顶, 空态提示) + 阅读页(W_CUSTOM 画布 3 栏翻页 +中央菜单占位(字号±/行距±/返回) +顶栏进度%/章节名) + 书桥(段表+flat 页索引, 渲染, 重排回锚) + 进度持久化(MeowData/os.meow.reader/progress/, path hash→seg/ch/fs/ls/ts) - 取舍: 正文字体 FreeType 直读 TF MeowOS/fonts/ TTF/OTF; 无字体回退 SDK 位图字库(meow_ui_text, 未打包字体(许可/体积), 全 glyph 兜底 R2); 页位图缓存当前+前后各1页(3×691KB), 翻页动画默认无 - 内存实测(宿主 --wrap malloc, 73页书): 书结构 130KB + 当前段刮擦~1.6MB(行/页容量按 n 偏高,R2 收紧) + 字形缓存~650KB + 3页位图 2.07MB ≈ 4.45MB 动态, 在 ≤8MB 阅读态预算内 - 测试: 宿主 core 58/58(enc/gb18030金标准/kinsoku/page/reflow/txt); qemu-mipsel ft_smoke PASS + book_smoke(12页/渲染有墨/翻页/重排回锚) PASS; reader 交叉 -Wall -Wextra 0 warning - 产物: reader(mipsel 静态1.2MB)+build_reader.sh(vendor FreeType 可复现); vendor/二进制 gitignore
94 lines
4.0 KiB
Bash
Executable File
94 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
||
# build_reader.sh — os.meow.reader R1 可复现构建:vendor FreeType(mipsel musl 静态) → 链 reader 二进制
|
||
# + 宿主 core 单测 + qemu-mipsel FreeType 冒烟。
|
||
#
|
||
# 产物:
|
||
# reader mipsel 静态 ELF(链 meow_ui.a + FreeType + core + engine)
|
||
# test/test_reader_core_host 宿主 core 单测(enc/layout/kinsoku/page/reflow/txt)
|
||
# test/rdft_smoke_mipsel qemu-mipsel FreeType 封装冒烟
|
||
#
|
||
# 约束:只写本目录(patch_v2/reader_app/);不改 sdk/;-Wall -Wextra 0 warning。
|
||
# vendor/(FreeType 源码+构建产物)gitignore,不入仓;build 脚本可复现。
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
ROOT="$HOME/Project/R3ProII"
|
||
CC="$ROOT/.tools/zig-mipsel-cc"
|
||
SYSROOT="$ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf"
|
||
HOST_CC="${HOST_CC:-gcc}"
|
||
|
||
FT_VER="2.14.3"
|
||
VENDOR="$PWD/vendor"
|
||
FT_SRC="$VENDOR/freetype-src"
|
||
FT_BUILD="$VENDOR/freetype-build"
|
||
FT_INC_SRC="$FT_SRC/include"
|
||
FT_INC_BUILD="$FT_BUILD/include"
|
||
|
||
# ---------- 1) FreeType vendor 拉取 ----------
|
||
mkdir -p "$VENDOR"
|
||
fetch_freetype() {
|
||
# 优先级:env FREETYPE_SRC → 本目录 vendor 已存在 → /tmp/freetype → 下载
|
||
if [ -n "$FREETYPE_SRC" ] && [ -f "$FREETYPE_SRC/CMakeLists.txt" ]; then
|
||
cp -r "$FREETYPE_SRC" "$FT_SRC"
|
||
elif [ ! -d "$FT_SRC" ] && [ -f /tmp/freetype/CMakeLists.txt ]; then
|
||
cp -r /tmp/freetype "$FT_SRC"
|
||
elif [ ! -d "$FT_SRC" ]; then
|
||
echo "==> downloading freetype $FT_VER"
|
||
rm -rf "$FT_SRC"
|
||
( 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_SRC 不可用/下载失败"; exit 1; }
|
||
}
|
||
fetch_freetype
|
||
|
||
# ---------- 2) FreeType mipsel 交叉静态构建(禁用可选项,只要最简) ----------
|
||
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
|
||
[ -f "$FT_BUILD/libfreetype.a" ] || { echo "FreeType build FAILED"; exit 1; }
|
||
FT_INCS="-I$FT_BUILD -I$FT_INC_BUILD -I$FT_INC_SRC"
|
||
echo "==> freetype.a: $(du -h "$FT_BUILD/libfreetype.a" | cut -f1)"
|
||
|
||
# ---------- 3) 宿主 core 单测 ----------
|
||
echo "==> host core test"
|
||
$HOST_CC -O2 -Wall -Wextra -Icore -I. test/test_reader_core.c \
|
||
core/rdenc.c core/rdlayout.c core/rdtxt.c -o test/test_reader_core_host -lm
|
||
./test/test_reader_core_host
|
||
|
||
# ---------- 4) qemu-mipsel FreeType 冒烟 ----------
|
||
echo "==> mipsel ft smoke"
|
||
$CC -Os -static -Wall -Wextra -Iengine $FT_INCS test/rdft_smoke.c engine/rdft.c \
|
||
"$FT_BUILD/libfreetype.a" -o test/rdft_smoke_mipsel
|
||
timeout 120 qemu-mipsel ./test/rdft_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}"
|
||
|
||
# ---------- 4b) qemu-mipsel 书桥全链路冒烟 ----------
|
||
echo "==> mipsel book smoke"
|
||
$CC -Os -static -Wall -Wextra -Iapp -Icore -Iengine $FT_INCS test/book_smoke.c \
|
||
app/book.c core/rdenc.c core/rdlayout.c core/rdtxt.c engine/rdft.c \
|
||
"$FT_BUILD/libfreetype.a" -o test/book_smoke_mipsel
|
||
timeout 120 qemu-mipsel ./test/book_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}"
|
||
|
||
# ---------- 5) reader 二进制(mipsel 静态) ----------
|
||
echo "==> reader binary"
|
||
CORE="core/rdenc.c core/rdlayout.c core/rdtxt.c"
|
||
ENGINE="engine/rdft.c"
|
||
APP="app.c app/shelf.c app/reader.c app/book.c app/progress.c"
|
||
$CC -Os -static -Wall -Wextra -I../sdk -I. -Icore -Iapp -Iengine $FT_INCS \
|
||
$CORE $APP $ENGINE \
|
||
../sdk/meow_ui.a "$SYSROOT/lib/libz.a" "$FT_BUILD/libfreetype.a" -lpthread -o reader
|
||
ls -la reader
|
||
file reader
|
||
echo " 运行(qemu): qemu-mipsel ./reader"
|
||
echo "build_reader OK"
|