fix(reader): txt编码误判(UTF-8前窗截断判GB18030致乱码) + build_index无持久化(整本重排慢/UI阻塞卡) — ①rd_utf8_sample_ok结尾不完整序列按合法(中间非法仍拒,GBK不误判,新增t13回归) ②索引落盘MeowData/os.meow.reader/index/*.idx(失效键size/mtime/font/fs/ls/wh/enc,命中秒开,原子写+强自检弃坏缓存,编码/字号/行距重排重写) 重开<0.3s/首开建cache; test_reader_core 72-0, 0warning

This commit is contained in:
AskaEth committed 2026-11-04 19:47:10 +08:00
1 parent 68710d7ed8
commit a64ae06eb6
5 files changed
+257 -4

No files matched your search

+25
View File
@@ -633,6 +633,28 @@ static void reader_scrub_begin(int x, int y)
}
/* ---------- 打开 ---------- */
/* R3.1:页索引缓存目录 = <TF>/MeowData/os.meow.reader/index。由 meow_config_dir
* (<TF>/MeowData/<pkg>/data) 剥尾 "/data" → <TF>/MeowData/<pkg>,接 "index",mkdir -p 后注入。 */
static void reader_setup_index_dir(void)
{
const char *data = meow_config_dir();
if (!data || !data[0]) return; /* 无卡/宿主:不持久(book.c 直排) */
char base[420];
size_t n = strlen(data);
const char *suf = "/data"; size_t sl = strlen(suf);
size_t keep = (n >= sl && strcmp(data + n - sl, suf) == 0) ? n - sl : n;
if (keep >= sizeof base) keep = sizeof base - 1;
memcpy(base, data, keep); base[keep] = 0;
char dir[440];
if (snprintf(dir, sizeof dir, "%s/index", base) >= (int)sizeof dir) return;
/* mkdir -p 幂等(progress 同款) */
char t[440];
strncpy(t, dir, sizeof t - 1); t[sizeof t - 1] = 0;
for (char *c = t + 1; *c; c++) if (*c == '/') { *c = 0; mkdir(t, 0755); *c = '/'; }
mkdir(t, 0755);
rd_book_set_index_dir(dir);
}
int reader_open(const char *path)
{
if (!path || !path[0]) return -1;
@@ -661,6 +683,9 @@ int reader_open(const char *path)
/* 阅读页底/字色:rd.bg(默认纯黑,B)→ 覆盖 th->surface */
reader_resolve_bg(&g_page_bg, &g_page_fg);
/* 页索引缓存(建好目录并注入;命中则开书免整书重排,秒开) */
reader_setup_index_dir();
/* 开书(FreeType 路径带齐几何;无字体则 g_has_font=0 → atlas 兜底) */
int rc = rd_book_open(&g_book, path, fp, g_fs, g_ls, g_pw, g_ph, g_mx, g_my, g_top);
if (rc != 0) {