Files
MeowOS-SDK/tuku
AskaEth 462cfd5bc0 图库: 阅读器翻页按显示尺寸解码(零重采样)+ 多页闪退防御 + 从第 N 张开始(M17)
用户反馈「横竖翻页都卡(40 页也卡)」「140 张图的文件夹一打开就闪退」
「要从中间某张开始看」三条,本次分别处理:

翻页卡顿(真因:每帧一次重采样)
- 解码目标从「屏长边」改成「当前 fit/zoom 的显示尺寸」:适宽 3:4 页原来解成
  540x720、显示 480x640,draw_page_at 于是每帧走 meow_ui_img_scaled —— 每页每帧
  多一遍全图最近邻重采样 + 一次 1.2MB 临时 malloc/free(>128KB 走 mmap)。
- 现在解码结果与显示框一致(±2px 容差)→ 翻页/滚动热路径只有原生 blit。
- fit/zoom 变化时按新几何重解(slot_ready 判据 + 同页替换),不再残留缩放;
  已到解码预算或已是原始分辨率的小图不会反复重解。
- 拖动/吸附/fling 帧只 invalidate 内容区(顶栏静态,不再每帧重绘标题文字);
  异步落位只在「该页真的在屏幕上」时才重绘,预取邻居不刷屏。
- 页原始尺寸按册缓存(8B/页),绘制几何不再每帧 fopen probe 文件。

多页闪退(宿主未能复现,按内存边界防御)
- 常驻页图改为「显示尺寸」并加上限:单页 ≤3MB、整窗 ≤9MB(超限淘汰最远页);
  常驻内存只与解码窗大小有关,不随页数增长。
- 解码中间峰值 >12MB 的页直接跳过并显示占位 + WARN(旧代码 PNG/BMP 放到 40MB,
  3000x3000 就是 36MB 瞬时分配;JPEG 完全没上限)。140 页夹具(含坏图/超大图)
  走真实 UI 链路打开、翻页、跳页、条漫全部通过。

新增 mr_reader_open_dir_at(dir, start_index)(文件管理器模式入口)
- 显式下标优先于续读记录;-1=续读(旧入口语义),其它负数钳到 0,≥页数钳到末页。
- mr_reader_open_dir 保留为 (dir, MR_READER_START_RESUME) 的包装;reader.h 导出。

测试:新增 test_reader_perf(翻页零重采样/fit 切换/驻留上界)与
test_reader_many_pages(140 页 + 坏图/超大图 + 起始下标/钳制/续读优先级 + 条漫跳页)。
2026-11-05 18:06:26 +08:00
..

tuku(os.meow.picbrowser)打包与签名

图库 App(系统包名 os.meow.picbrowser)。构建与打包:

./build_tuku.sh            # 交叉编译 picbrowser(MIPS32r2 静态)
./pack_tuku.sh             # 打包 → os.meow.picbrowser.mpk(根布局;未签名)

一键签名出包

MEOW_SIGN_KEY=/path/to/signing.key ./pack_tuku.sh
  • 工具查找顺序:$MEOW_SIGN → PATH 里的 meow_sign → $HOME/Proj/MeowOS-For-R3P2/patch_v2/meow_sign/meow_sign。
  • 私钥:$MEOW_SIGN_KEY。未设置时脚本警告并仍产出未签名包(退出码 0);但 os.meow.* 系统包无签名会被设备拒装。
  • 有工具 + 密钥时执行 meow_sign sign <mpk> <key>;若存在 <key>.pub 再执行 meow_sign verify <mpk> <key>.pub。
  • 私钥不入库、不随包分发;本仓不包含任何密钥材料。

mpk 布局

.mpk = tar.gz,条目直接在根层:

os.meow.picbrowser.mpk
├── app.json
├── picbrowser
└── <signature footer>   # 仅签名包有(Ed25519,尾部追加)

即 tar -C build/os.meow.picbrowser -czf os.meow.picbrowser.mpk app.json picbrowser—— 不带 os.meow.picbrowser/ 目录前缀,也不带 ./ 前缀。脚本在签名前用 tar -tzf 断言这一点。

签名是往 tar.gz 尾部追加 footer,签名后的 mpk 不要再跑 tar -t / gzip 之类的命令: gzip 会报 trailing garbage ignored,属预期现象,不是包损坏。要检查布局请在签名前做。

安装

把 .mpk 放到设备 TF 卡,执行 nyai install os.meow.picbrowser.mpk; os.meow.* 包必须验签通过(footer.package == 文件名茎 == app.json.package)。