/* * 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(); }