Files
Sprinter-SDCC/libbgi/common/gfx_blit_noclip_vflip.c
T
snark13 3f45430454 libbgi: vflip-блиты для row-major картинок (шаг I.2 плана L9-INVERT)
gfx_blit_noclip_vflip / gfx_blit_part_noclip_vflip / gfx_blit_part_vflip.
Ассемблера не потребовалось: у row-major вертикальное зеркало — это порядок
строк, а он задаётся ЗНАКОМ src-страйда, который _bgi_blit_rows_raw и так
принимает знаковым и патчит SMC.  Даём адрес последней строки и -stride.

Клип у part_vflip свой: обрезка сверху экрана съедает НИЖНИЕ строки
источника, и первая строка обязана считаться от высоты ДО клипа (поймано
тестом — сначала формула брала уже укороченную).

tests/pageflip расширен до 8 проверок, все PASS в MAME.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 17:35:50 +03:00

37 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* gfx_blit_noclip_vflip — блит картинки БЕЗ клипа, ЗЕРКАЛЬНО ПО ВЕРТИКАЛИ:
* последняя строка источника ложится в верхнюю строку прямоугольника,
* первая — в нижнюю. (x,y) — по-прежнему ЛЕВЫЙ ВЕРХНИЙ угол результата,
* так что вызывающему не надо менять арифметику позиции.
*
* Ассемблера здесь нет и не нужно: у row-major картинки вертикальное
* зеркало — это порядок строк, а он задаётся ЗНАКОМ src-страйда.
* `_bgi_blit_rows_raw` берёт `sstride` знаковым 16-битным и патчит его SMC
* в adc-цепочку, поэтому достаточно отдать ему адрес ПОСЛЕДНЕЙ строки и
* -stride. Цена кадра ровно та же, что у обычного блита — accel копирует
* каждую строку вперёд, назад идёт только выбор строки.
*
* (Для column-major картинок — gfx_blit_cols* — так НЕ выйдет: там зеркало
* по вертикали пришлось бы делать внутри колонки, а accel копирует блок
* только вперёд. Бесплатное зеркало у них горизонтальное.)
*
* Ограничения те же, что у gfx_blit_noclip: w,h ≤ 255, картинка целиком в
* пределах экрана, банк ставит вызывающий.
*/
#include "../_bgi.h"
void gfx_blit_noclip_vflip(int x, int y, const void *img)
{
const uint8_t *p = (const uint8_t *)img;
uint16_t stride = (uint16_t)(p[0] | (p[1] << 8));
uint8_t h = p[2];
if (!stride || !h) return;
_bgi_begin();
_bgi_blit_rows_raw(p + 4 + (uint16_t)(h - 1) * stride,
(uint8_t *)(_gfx_addr_base + x),
p[0], h, -(int)stride, (uint8_t)y);
_bgi_end();
}