mdview2: единая позиция при переключениях F2 (MD↔RAW) и F8 (8bit↔UTF-8)
Валюта позиции — байт-offset активного буфера: - line_at_off(off): обратный перевод offset → MD-строка (бинарный поиск по seg_off, оффсеты сегментов монотонны); - map_off(off, from, to): пропорциональный перенос позиции между буферами разного размера — один цикл restoring-деления, без __mullong/__divulong, точность from/65536; - raw_pos()/raw_reanchor(off) в RAW-модуле; raw_seed_from через reanchor, raw_home стал приватным (только клавиша Home). F2 RAW→MD: top_line = line_at_off(raw_pos()) — точное позиционирование. F8 между готовыми наборами: view_pos → map_off → view_reanchor вместо восстановления сохранённой позиции набора. Ленивая сборка — по-прежнему с начала (в RAW с raw_reanchor(0) и откатом при неудаче). Попутно: F8 в RAW-режиме больше не рисует MD-вид поверх RAW — перерисовка по g_view. exe 25100 → 25725 (+625). Проверено в MAME. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -139,12 +139,14 @@ void win_rest(uint8_t row, uint8_t col, uint8_t h, uint8_t w, uint8_t page,
|
||||
void fill_row(uint8_t y, uint8_t attr);
|
||||
uint8_t pct16(uint16_t num, uint16_t den); /* num*100/den (0..100), 16-бит, без __divulong */
|
||||
uint32_t seg_off(uint16_t idx); /* offset исходника для логической строки idx */
|
||||
uint16_t line_at_off(uint32_t off); /* обратно: последняя строка с seg_off <= off */
|
||||
|
||||
/* ================================================================== *
|
||||
* API модуля RAW (mdview2_raw.c).
|
||||
* ================================================================== */
|
||||
void raw_seed_from(uint16_t md_top_line); /* вход в RAW: позиция по top_line */
|
||||
void raw_home(void); /* сброс в начало (смена буфера при F8 в/из UTF-8) */
|
||||
void raw_seed_from(uint16_t md_top_line); /* вход в RAW: позиция по top_line */
|
||||
uint32_t raw_pos(void); /* текущий байт-offset верха экрана RAW */
|
||||
void raw_reanchor(uint32_t off); /* поставить RAW на строку с байтом off */
|
||||
void raw_draw(void); /* перерисовать область документа в RAW */
|
||||
uint8_t raw_pct(void); /* % прокрутки по байтам (для render_raw_status_numbers) */
|
||||
uint8_t raw_key(uint8_t scan); /* навигация RAW; 1 = обработано */
|
||||
|
||||
Reference in New Issue
Block a user