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:
1 parent
68710d7ed8
commit
a64ae06eb6
5 files changed
+257
-4
No files matched your search
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user