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:
+33
-38
@@ -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 (;;) { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user