52636a5d6e
Графика вынесена из libc/ в новую библиотеку libbgi/:
- common/ — mode-agnostic математика и состояние (один исходник,
.rel попадает в оба driver-архива);
- bgi256/ + bgi16/ — mode-specific leaf'ы (raw-плот/чтение/спаны);
- include/ — graphics.h + gfx.h; _bgi.h — внутренний заголовок.
Собираются lib/bgi256.lib (и bgi16.lib в Фазе 2); выбор режима
линковкой через sprinter-cc --gfx 256|16. libc/ теперь без графики.
tests/bgi_img — тест спрайтов getimage/putimage/imagesize (5 операций
COPY/XOR/OR/AND/NOT + XOR-round-trip + self-check imagesize).
Проверен автотестом в MAME.
Примечание: make size-check пока красный (gfx_dbuf/gfx_demo выросли
после реорга) — закрыть по завершении миграции libbgi.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48 lines
2.0 KiB
C
48 lines
2.0 KiB
C
/*
|
|
* _bgi_fill_span — залить строку [x0..x1] на y текущим стилем заливки.
|
|
*
|
|
* SOLID → быстрый raw-hline; EMPTY → hline фоновым цветом; паттерн →
|
|
* поточечно по 8×8-битовой маске (строка паттерна = pat[y&7], бит x&7).
|
|
* Клип по экрану внутри. ВЫЗЫВАТЬ между _bgi_begin/_bgi_end.
|
|
*/
|
|
|
|
#include "../_bgi.h"
|
|
|
|
/* Стандартные 8×8-паттерны Borland, индексы LINE_FILL..CLOSE_DOT_FILL. */
|
|
static const uint8_t _bgi_pat[10][8] = {
|
|
{ 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00 }, /* LINE_FILL */
|
|
{ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 }, /* LTSLASH_FILL */
|
|
{ 0xE0,0xC1,0x83,0x07,0x0E,0x1C,0x38,0x70 }, /* SLASH_FILL */
|
|
{ 0xF0,0x78,0x3C,0x1E,0x0F,0x87,0xC3,0xE1 }, /* BKSLASH_FILL */
|
|
{ 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 }, /* LTBKSLASH_FILL */
|
|
{ 0xFF,0x88,0x88,0x88,0xFF,0x88,0x88,0x88 }, /* HATCH_FILL */
|
|
{ 0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81 }, /* XHATCH_FILL */
|
|
{ 0xCC,0x33,0xCC,0x33,0xCC,0x33,0xCC,0x33 }, /* INTERLEAVE_FILL */
|
|
{ 0x80,0x00,0x08,0x00,0x80,0x00,0x08,0x00 }, /* WIDE_DOT_FILL */
|
|
{ 0x88,0x00,0x22,0x00,0x88,0x00,0x22,0x00 }, /* CLOSE_DOT_FILL */
|
|
};
|
|
|
|
void _bgi_fill_span(int x0, int x1, int y)
|
|
{
|
|
int x;
|
|
uint8_t p, row;
|
|
|
|
if (x1 < x0) { x = x0; x0 = x1; x1 = x; }
|
|
if (y < 0 || y > _bgi_maxy) return;
|
|
if (x0 < 0) x0 = 0;
|
|
if (x1 > _bgi_maxx) x1 = _bgi_maxx;
|
|
if (x1 < x0) return;
|
|
|
|
p = _bgi_fill_pattern;
|
|
if (p == EMPTY_FILL) { _bgi_hspan_raw(x0, y, x1 - x0 + 1, _bgi_bg); return; }
|
|
if (p == SOLID_FILL || p == USER_FILL || p > CLOSE_DOT_FILL) {
|
|
_bgi_hspan_raw(x0, y, x1 - x0 + 1, _bgi_fill_color);
|
|
return;
|
|
}
|
|
/* Паттерн LINE_FILL..CLOSE_DOT_FILL. */
|
|
row = _bgi_pat[p - LINE_FILL][y & 7];
|
|
for (x = x0; x <= x1; x++)
|
|
if ((row >> (x & 7)) & 1)
|
|
_bgi_plot_raw(x, y, _bgi_fill_color);
|
|
}
|