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:
@@ -173,17 +173,27 @@ uint8_t calc_raw_pct(void)
|
||||
|
||||
/* ---- посев позиции / пересев при смене активного буфера ----------- */
|
||||
|
||||
void raw_seed_from(uint16_t md_top_line)
|
||||
uint32_t raw_pos(void)
|
||||
{
|
||||
uint32_t off = seg_off(md_top_line);
|
||||
if (off > file_size) off = 0;
|
||||
return raw_top;
|
||||
}
|
||||
|
||||
/* Поставить RAW на начало строки, содержащей байт off (позиционирование
|
||||
* при F2 MD→RAW и F8-переносе позиции между наборами). */
|
||||
void raw_reanchor(uint32_t off)
|
||||
{
|
||||
if (off > file_size) off = file_size;
|
||||
raw_top = raw_line_start(off);
|
||||
raw_hpan = 0;
|
||||
}
|
||||
|
||||
/* Сброс в начало — при смене активного буфера (F8 в/из UTF-8: размеры/offset'ы
|
||||
* разные, старый raw_top невалиден). Без percent-математики. */
|
||||
void raw_home(void)
|
||||
void raw_seed_from(uint16_t md_top_line)
|
||||
{
|
||||
raw_reanchor(seg_off(md_top_line));
|
||||
}
|
||||
|
||||
/* Сброс в начало (клавиша Home). */
|
||||
static void raw_home(void)
|
||||
{
|
||||
raw_top = 0;
|
||||
raw_hpan = 0;
|
||||
|
||||
Reference in New Issue
Block a user