libc: BGI Фаза 2c — floodfill/pieslice/sector

floodfill — скан-строчная заливка области до границы (self-bracket
чтение: корректно, но медленно; raw-оптимизация в TODO).
pieslice/sector — залитые сектора круга/эллипса: границу (центр→дуга→
центр) прогоняем через _bgi_poly_edge и заливаем min/max по строкам,
как fillpoly (для >180° возможен перелив — упрощение). Проверено в
MAME (tests/bgitest): floodfill круга, круговая диаграмма, штрих-сектор.

Доки/справочник/память обновлены (Ф2a-c готовы; Ф2d = images/viewport/
text-style/line-style — осталось).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 16:04:04 +03:00
parent ecb419efda
commit dc37a14010
8 changed files with 186 additions and 44 deletions
+21 -32
View File
@@ -1,8 +1,6 @@
/*
* bgitest — демонстрация BGI-слоя graphics.h (режим 320×256×256).
*
* Собирается с `--gfx 256`. Фаза 2b: заливки — bar (сплошная/паттерн),
* bar3d, fillpoly, fillellipse + setfillstyle. Визуальная проверка.
* Фаза 2c: floodfill + pieslice/sector.
*/
#include <graphics.h>
@@ -10,49 +8,40 @@
int main(void)
{
int mx, my;
static const int tri[] = { 210, 235, 300, 235, 255, 150 };
initgraph();
mx = getmaxx();
my = getmaxy();
cleardevice();
setcolor(WHITE);
rectangle(0, 0, mx, my);
setcolor(YELLOW);
outtextxy(110, 6, "BGI FILLS P2b");
outtextxy(96, 6, "BGI flood + pie");
/* Сплошной бар. */
setfillstyle(SOLID_FILL, RED);
bar(12, 28, 92, 78);
/* Окружность-контур, затем floodfill её нутра. */
setcolor(YELLOW);
circle(66, 90, 46);
setfillstyle(SOLID_FILL, LIGHTRED);
floodfill(66, 90, YELLOW);
setcolor(WHITE);
outtextxy(12, 82, "solid");
outtextxy(38, 142, "floodfill");
/* Бар с штриховкой (HATCH). */
setfillstyle(HATCH_FILL, LIGHTGREEN);
bar(110, 28, 190, 78);
setcolor(WHITE);
outtextxy(110, 82, "hatch");
/* 3D-брусок с диагональной штриховкой. */
setcolor(WHITE);
setfillstyle(SLASH_FILL, LIGHTCYAN);
bar3d(210, 34, 280, 78, 14, 1);
outtextxy(210, 82, "bar3d");
/* Залитый эллипс (сплошной). */
setcolor(WHITE);
/* Круговая диаграмма из трёх pieslice. */
setfillstyle(SOLID_FILL, LIGHTGREEN);
pieslice(210, 86, 0, 90, 52);
setfillstyle(SOLID_FILL, LIGHTBLUE);
fillellipse(70, 150, 55, 32);
outtextxy(44, 186, "fillellipse");
/* Залитый треугольник (крестовая штриховка), контур WHITE. */
pieslice(210, 86, 90, 200, 52);
setfillstyle(SOLID_FILL, LIGHTMAGENTA);
pieslice(210, 86, 200, 360, 52);
setcolor(WHITE);
setfillstyle(XHATCH_FILL, LIGHTMAGENTA);
fillpoly(3, tri);
outtextxy(214, 194, "fillpoly");
outtextxy(184, 146, "pieslice");
/* Эллиптический сектор со штриховкой. */
setfillstyle(HATCH_FILL, LIGHTCYAN);
sector(120, 210, 20, 160, 90, 34);
setcolor(WHITE);
outtextxy(96, 236, "sector");
for (;;) { }
}