/* * pop_vflip.h — зеркальные по вертикали копии страниц атласов персонажей * (зелье инверсии, уровень 9). Реализация и «почему постранично» — * в pop_vflip.c. * * Кому нужно. Фон и все row-major спрайты переворачиваются даром (порядок * строк = знак страйда, gfx_blit_*_vflip), а персонажи хранятся колонками — * им нужен заранее развёрнутый набор пикселей. Отсюда правило вызывающего: * * страница = pop_upside ? pop_vflip_page(a->page) : a->page; * * и больше НИЧЕГО не меняется: смещения лент, размеры кадров, флип по * горизонтали (знак страйда) остаются как были. * * Почему кэш не сбрасывается на каждом перевороте: зелье инверсии в * оригинале переключает состояние туда-обратно (второе зелье, смерть Кида — * seg000:1224), и держать 34 страницы EMM дешевле, чем перезеркаливать по * 16 КБ при каждом переключении. Бюджет EMM это позволяет: свободно ~215 * страниц из 256 (memory sprinter_emm_budget). Освобождаем на смене * уровня — вместе с самими атласами. */ #ifndef POP_VFLIP_H #define POP_VFLIP_H #include /* Номер страницы с ВЕРТИКАЛЬНО ЗЕРКАЛЬНОЙ копией атласа src. Первый вызов * для страницы делает копию (~16 КБ побайтно — ощутимо, но однократно), * дальше отдаёт из кэша. 0 — не хватило EMM-страниц (вызывающий должен * нарисовать обычным атласом: лучше неперевёрнутый кадр, чем пустота). */ uint8_t pop_vflip_page(uint8_t src); /* Освободить все копии (смена уровня). Атласы к этому моменту тоже * перезагружаются, и старые копии стали бы мусором. */ void pop_vflip_reset(void); #endif /* POP_VFLIP_H */