- 条漫:meow_scroll 跟手+fling,按滚动位置懒解码视口±1 页(驻留上限 4 页); 排版用 mr_book_meta 累加适宽高度(nav.c 纯逻辑,宿主可测) - 模式:阅读 chrome 图标一键切翻页/条漫;每册模式与 last page 经 meow_config 持久化 (reader.mode/page.<FNV1a64(册路径)>),重进该册恢复模式与页码 - 续读:离开/翻页/滚动停止节流落盘;书库扫描给含图册副标题追加「· 续读 Pn」 - 册间衔接:末页前进→同父目录下一含图册首页,首页后退→上一册末页;无相邻册轻提示不退出 - 跳页:chrome 内 meow_slider,目标页预解码完成后落位(2.5s 超时降级提示) - 解码:改走 M12 预算解码 meow_img_load_file_dim;超大 PNG/BMP 先 probe 预判, 超 40MiB 原始 RGBA 跳过并显示「图片无法显示」,12MiB 以上记 WARN(如实保留残余风险) - 测试:新增条漫排版/跳页状态/模式续读持久化/册间边界宿主测试,以及真实 SDK 源码树上的 阅读器集成测试(模式切换/跳页落位/续读/跨册),test/run_webtoon_tests.sh 一键运行
55 lines
2.6 KiB
C
55 lines
2.6 KiB
C
/* logic/reader.h — 阅读器纯逻辑接缝(M4 填充实现,M3 先落状态 API;M7 追加模式与每册续读状态)。
|
||
*
|
||
* 阅读方向默认 RTL(日式漫画从右往左翻);设置页/阅读器可切 LTR。
|
||
* 阅读模式(翻页/条漫)与每册 last page 走 meow_config 持久化,键含册标识。
|
||
* 本模块保持纯 C(不 include meow_ui.h),宿主可直接测。
|
||
*/
|
||
#ifndef MR_READER_H
|
||
#define MR_READER_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#define MR_DIR_RTL 1 /* 默认:右到左(日漫) */
|
||
#define MR_DIR_LTR 0 /* 左到右 */
|
||
|
||
int mr_reader_get_direction(void);
|
||
/* 只接受 MR_DIR_RTL / MR_DIR_LTR;其它值忽略(保持原方向)。 */
|
||
void mr_reader_set_direction(int dir);
|
||
|
||
/* ============================================================ */
|
||
/* 阅读模式(M7):左右翻页 / 条漫竖向连续滚动 */
|
||
/* ============================================================ */
|
||
#define MR_MODE_PAGED 0 /* 左右翻页(默认) */
|
||
#define MR_MODE_WEBTOON 1 /* 条漫:垂直连续滚动 */
|
||
|
||
int mr_mode_valid(int mode);
|
||
const char *mr_mode_name(int mode); /* "paged" / "webtoon"(配置值;非法按 paged) */
|
||
int mr_mode_parse(const char *s); /* -1=未知 */
|
||
|
||
/* ============================================================ */
|
||
/* 每册续读状态(last page + mode,meow_config 持久化) */
|
||
/* ------------------------------------------------------------
|
||
* 键 = reader.<field>.<FNV-1a64(规范化目录路径)>:同一册(同一目录)跨启动恢复,
|
||
* 不同册互不影响;目录改名/移动视为新册。写失败只 WARN(best-effort,不阻断阅读)。
|
||
* 依赖:只 include 配置/日志两个模块头,宿主测试用 settings_reader_stub 顶替。
|
||
* ============================================================ */
|
||
#define MR_CONT_PATH_MAX 512 /* 册路径规范化的本地缓冲(同 MR_PATH_MAX 口径) */
|
||
#define MR_CONT_PAGE_MAX 1000000 /* 配置里 last page 的合理上限(防坏值) */
|
||
|
||
int mr_cont_key(const char *dir, const char *field, char *out, int outsz);
|
||
int mr_cont_get_mode(const char *dir, int def);
|
||
void mr_cont_set_mode(const char *dir, int mode);
|
||
int mr_cont_get_page(const char *dir, int def);
|
||
void mr_cont_set_page(const char *dir, int page);
|
||
/* 一次写 page+mode(尽最大努力,两键分别尝试)。 */
|
||
void mr_cont_save(const char *dir, int page, int mode);
|
||
/* 书库行续读角标:1=写入 "续读 P5"(page>0 才有记录);0=无。 */
|
||
int mr_cont_badge(const char *dir, char *out, int outsz);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* MR_READER_H */
|