评审用真实 UI 链路实测:600x960、800x1280(长宽比 1.6)在翻页拖动与条漫模式 都是 blit+0 / scaled+5;「先适高再切条漫」scaled+10。根因是解码几何来源与排版几何 不同源:decode_long_side() 把长边钳到屏长边 720(600x960 解成 450x720),而 strip_page_height() 按屏宽算出 480x768;mode_set() 又不动 g_fit,适高/原始进条漫 100% 重采样。 修复: - 解码目标 = 排版真正要的显示框:新增 page_geometry_at()(条漫=strip 高度、宽=视口宽; 翻页=fit/zoom),解码计划与绘页/就绪判据同源。 - plan_decode_long() 去掉屏长边钳制,只保留 MR_PAGE_BYTES_CAP(3MB) 硬上界, 超长条漫按比例收缩(不再因为「高度 > 屏长边」就永远对不上)。 - slot 记录本次解码的 want 几何;slot_ready() 改为几何比较: fit/缩放/模式变化 → 重解一次(放大再缩回、适高→条漫回到纯 blit); 被 3MB 钳住的解码 want 不变 → 不再反复重解(大屏活锁)。 - 解码几何随 page_req 下发、随 page_res 返回:worker 不再读 g_fit/g_zoom/g_vw/g_vh。 - 峰值估算把 downscale/缩解输出一并计入(P2-3)。 - 适宽长图(竖向单独溢出)不再算平移模式:1.6 比例页原先左右 tap/横拖会变成 「水平平移 0px」的空操作,页面根本翻不动;现在仍按翻页处理(原始档/横向溢出不变)。 - 窗口不再主动清窗口外的页图:0→1→0 来回翻不再反复重解同一页(140 页测试 decode 次数 21→14);容量仍由 MR_SLOTS + 字节淘汰兜底。 - state_reset 复位 g_meta/g_start_at(起始页在 on_enter 入口先取走),删重复注释。 测试:test_reader_perf 夹具改成 600x960(1.6)并补 800x1280、翻页拖动、条漫、 「适高→条漫」、双击放大缩回、静止无重解、大屏 1080x1920 无活锁;test_reader_many_pages 补 meow_ui_paint_full(绘制路径覆盖,P2-5)。
45 lines
2.2 KiB
C
45 lines
2.2 KiB
C
/* ui/reader/reader.h — 阅读页给 app.c 的事件接缝(跟手拖动/平移)。
|
||
*
|
||
* app.c 只做最小路由:ACT_READER 时的 on_touch_down/move 转给这里(镜像 library 分支)。
|
||
* 其余入口(on_tap / view on_event / mr_reader_open_dir)仍走 tuku_internal.h 的既有声明。
|
||
*/
|
||
#ifndef TUKU_UI_READER_READER_H
|
||
#define TUKU_UI_READER_READER_H
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
void reader_on_touch_down(int x, int y);
|
||
void reader_on_touch_move(int x, int y);
|
||
|
||
/* 书库 → 阅读器(文件管理器模式用):按目录内图片自然序从 start_index 开始。
|
||
* - start_index >= 册页数:钳到末页;其它负数按 0 处理;
|
||
* - start_index == MR_READER_START_RESUME(-1):沿用该册续读记录(= mr_reader_open_dir)。
|
||
* 显式下标优先于续读记录:用户在列表里点了某张图,就不该被上次的页码带走。 */
|
||
#define MR_READER_START_RESUME (-1)
|
||
void mr_reader_open_dir_at(const char *dir, int start_index);
|
||
/* 保留旧入口:等价于 mr_reader_open_dir_at(dir, MR_READER_START_RESUME)。 */
|
||
void mr_reader_open_dir(const char *dir);
|
||
|
||
#ifdef MR_READER_HOST_TEST
|
||
/* 宿主集成测试专用:只读观察本页状态(不参与产品逻辑)。 */
|
||
int mr_reader_ui_mode(void); /* MR_MODE_PAGED / MR_MODE_WEBTOON */
|
||
int mr_reader_ui_page(void); /* 当前页(条漫=视口顶端所在页) */
|
||
int mr_reader_ui_count(void); /* 当前册页数 */
|
||
int mr_reader_ui_jump_open(void); /* 1=跳页滑块已展开 */
|
||
int mr_reader_ui_jump_pending(void);/* 1=跳页目标等待解码 */
|
||
long mr_reader_ui_resident_kb(void);/* 驻留页图字节(KB) */
|
||
int mr_reader_ui_failed_pages(void);/* 解码失败/超预算被跳过的页数 */
|
||
int mr_reader_ui_blit_draws(void); /* 累计原生 blit 绘页次数(热路径应为纯 blit) */
|
||
int mr_reader_ui_scaled_draws(void);/* 累计重采样绘页次数(每帧重采样=卡顿) */
|
||
int mr_reader_ui_decode_count(void);/* 累计解码次数(查重解抖动/活锁) */
|
||
int mr_reader_ui_fit(void); /* 当前 fit 档(MR_FIT_*) */
|
||
int mr_reader_ui_chrome(void); /* 1=顶栏可见 */
|
||
#endif
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* TUKU_UI_READER_READER_H */
|