3f45430454
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>
37 lines
2.1 KiB
C
37 lines
2.1 KiB
C
/*
|
||
* 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();
|
||
}
|