libc: BGI Фаза 2b — заливки (setfillstyle/bar/bar3d/fillpoly/fillellipse)

setfillstyle/getfillsettings + 10 стандартных 8×8 паттернов Borland.
bar теперь честно учитывает стиль заливки; bar3d (3D-брусок), fillpoly
(scanline min/max по строкам через брезенхэмовский проход рёбер),
fillellipse (полуширина строки через целочисленный _bgi_isqrt — без
32-бит). Общий _bgi_fill_span (SOLID/EMPTY/паттерн) с клипом, поверх
raw-hline в одной W3-скобке. Проверено в MAME (tests/bgitest): solid/
hatch бары, bar3d со slash, синий fillellipse, xhatch-треугольник.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 15:58:06 +03:00
parent 5a48f7fafb
commit ecb419efda
17 changed files with 350 additions and 47 deletions
+33 -38
View File
@@ -1,23 +1,20 @@
/*
* bgitest — демонстрация BGI-слоя graphics.h (режим 320×256×256).
*
* Собирается с `--gfx 256` (см. Makefile). Показывает примитивы
* Фазы 1 (рамка/бары/линии/окружность/текст) и Фазы 2a
* (эллипс/дуга/полигон) — визуальная проверка в MAME.
* Собирается с `--gfx 256`. Фаза 2b: заливки — bar (сплошная/паттерн),
* bar3d, fillpoly, fillellipse + setfillstyle. Визуальная проверка.
*/
#include <graphics.h>
int main(void)
{
int i, mx, my;
/* треугольник для drawpoly (замкнут повтором первой точки). */
static const int tri[] = { 120, 244, 210, 244, 165, 210, 120, 244 };
int mx, my;
static const int tri[] = { 210, 235, 300, 235, 255, 150 };
initgraph();
mx = getmaxx(); /* 319 */
my = getmaxy(); /* 255 */
mx = getmaxx();
my = getmaxy();
cleardevice();
@@ -25,39 +22,37 @@ int main(void)
rectangle(0, 0, mx, my);
setcolor(YELLOW);
outtextxy(96, 6, "SPRINTER BGI P2");
outtextxy(110, 6, "BGI FILLS P2b");
/* Палитровая полоса: 15 залитых баров цветами 1..15. */
for (i = 1; i <= 15; i++) {
int x0 = 8 + (i - 1) * 20;
setcolor(i);
bar(x0, 22, x0 + 16, 40);
}
/* Сплошной бар. */
setfillstyle(SOLID_FILL, RED);
bar(12, 28, 92, 78);
setcolor(WHITE);
outtextxy(12, 82, "solid");
/* Окружность (Фаза 1). */
setcolor(LIGHTRED);
circle(60, 120, 40);
/* Бар с штриховкой (HATCH). */
setfillstyle(HATCH_FILL, LIGHTGREEN);
bar(110, 28, 190, 78);
setcolor(WHITE);
outtextxy(110, 82, "hatch");
/* Полный эллипс (Фаза 2a). */
setcolor(LIGHTGREEN);
ellipse(165, 120, 0, 360, 70, 40);
/* 3D-брусок с диагональной штриховкой. */
setcolor(WHITE);
setfillstyle(SLASH_FILL, LIGHTCYAN);
bar3d(210, 34, 280, 78, 14, 1);
outtextxy(210, 82, "bar3d");
/* Верхняя половина дуги (Фаза 2a). */
setcolor(LIGHTCYAN);
arc(270, 140, 0, 180, 35);
/* Залитый эллипс (сплошной). */
setcolor(WHITE);
setfillstyle(SOLID_FILL, LIGHTBLUE);
fillellipse(70, 150, 55, 32);
outtextxy(44, 186, "fillellipse");
/* Треугольник через drawpoly (Фаза 2a). */
setcolor(LIGHTMAGENTA);
drawpoly(4, tri);
/* Залитый треугольник (крестовая штриховка), контур WHITE. */
setcolor(WHITE);
setfillstyle(XHATCH_FILL, LIGHTMAGENTA);
fillpoly(3, tri);
outtextxy(214, 194, "fillpoly");
/* Веер линий слева. */
for (i = 150; i <= my - 6; i += 8) {
setcolor(1 + ((i - 150) / 8) % 15);
line(6, 175, 110, i);
}
setcolor(YELLOW);
outtextxy(120, 190, "circle ellipse arc poly");
for (;;) { } /* держим картинку на экране */
for (;;) { }
}