libc: BGI Фаза 2d-1 — getimage/putimage/imagesize (спрайты)

Растровые образы: imagesize (4 байта заголовка w,h + w*h пикселей),
getimage (захват прямоугольника), putimage с COPY/XOR/OR/AND/NOT_PUT.
Блит идёт raw в одной W3-скобке — добавлен _gfx_getpixel256_raw в gfx +
leaf _bgi_read_raw в drv256. Проверено в MAME (tests/bgitest): захват
спрайта, 3 COPY-копии, XOR/OR/COPY поверх фона.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 16:09:51 +03:00
parent dc37a14010
commit 25cb7ba554
10 changed files with 174 additions and 26 deletions
+29 -21
View File
@@ -1,10 +1,12 @@
/*
* bgitest — демонстрация BGI-слоя graphics.h (режим 320×256×256).
* Фаза 2c: floodfill + pieslice/sector.
* Фаза 2d-1: getimage/putimage/imagesize (спрайты, COPY/XOR/OR).
*/
#include <graphics.h>
static unsigned char buf[2048];
int main(void)
{
int mx, my;
@@ -17,31 +19,37 @@ int main(void)
setcolor(WHITE);
rectangle(0, 0, mx, my);
setcolor(YELLOW);
outtextxy(96, 6, "BGI flood + pie");
outtextxy(88, 6, "BGI image / sprite");
/* Окружность-контур, затем floodfill её нутра. */
setcolor(YELLOW);
circle(66, 90, 46);
setfillstyle(SOLID_FILL, LIGHTRED);
floodfill(66, 90, YELLOW);
setcolor(WHITE);
outtextxy(38, 142, "floodfill");
/* Круговая диаграмма из трёх pieslice. */
setfillstyle(SOLID_FILL, LIGHTGREEN);
pieslice(210, 86, 0, 90, 52);
/* Исходный спрайт 40×30 в левом верхнем углу. */
setfillstyle(SOLID_FILL, LIGHTBLUE);
pieslice(210, 86, 90, 200, 52);
setfillstyle(SOLID_FILL, LIGHTMAGENTA);
pieslice(210, 86, 200, 360, 52);
bar(12, 28, 51, 57);
setcolor(YELLOW);
rectangle(12, 28, 51, 57);
setcolor(LIGHTRED);
line(12, 28, 51, 57);
setfillstyle(SOLID_FILL, LIGHTGREEN);
fillellipse(31, 42, 8, 8);
setcolor(WHITE);
outtextxy(184, 146, "pieslice");
outtextxy(12, 60, "src");
/* Эллиптический сектор со штриховкой. */
setfillstyle(HATCH_FILL, LIGHTCYAN);
sector(120, 210, 20, 160, 90, 34);
/* Захват и раскладка копий (COPY_PUT). */
getimage(12, 28, 51, 57, buf);
putimage(80, 28, buf, COPY_PUT);
putimage(130, 28, buf, COPY_PUT);
putimage(180, 28, buf, COPY_PUT);
setcolor(WHITE);
outtextxy(96, 236, "sector");
outtextxy(80, 60, "copy x3");
/* XOR и OR поверх серого фона. */
setfillstyle(SOLID_FILL, DARKGRAY);
bar(20, 110, 240, 170);
putimage(30, 122, buf, XOR_PUT);
outtextxy(30, 176, "xor");
putimage(110, 122, buf, OR_PUT);
outtextxy(110, 176, "or");
putimage(190, 122, buf, COPY_PUT);
outtextxy(190, 176, "copy");
for (;;) { }
}