e761d21505
Функционально-совместимый с Turbo-C <graphics.h> поверх gfx.h. Архитектура: mode-agnostic математика (libc/bgi/*.c → sprinter.lib) + driver-leaf'ы per-режим (libc/bgi/drv256/*.c → sprinter_gfx256.lib). Режим выбирается линковкой: sprinter-cc --gfx 256 (16 — позже, тем же leaf-split'ом). Один код работает в любом режиме без правок. API: initgraph/closegraph/graphresult/cleardevice, set/get color+bkcolor, getmaxx/y/color, put/getpixel, moveto/moverel/getx/gety, line/lineto/ linerel, rectangle, bar, circle, outtext/outtextxy. initgraph грузит EGA-палитру 0..15. Пакетные примитивы (circle) — одна W3-скобка на примитив (иначе на порядок медленнее). Проверено в MAME (tests/bgitest). Попутно: gfx_getpixel256 в libc/gfx. size-check без регресса, baseline обновлён. Детали: memory/bgi_two_lib_design, docs/TODO.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
62 lines
1.8 KiB
C
62 lines
1.8 KiB
C
/*
|
||
* bgitest — демонстрация BGI-слоя graphics.h (режим 320×256×256).
|
||
*
|
||
* Собирается с `--gfx 256` (см. Makefile). Рисует рамку, заголовок,
|
||
* палитровую полосу, веер линий, вложенные окружности и залитые бары —
|
||
* визуальная проверка ядра BGI (Фаза 1).
|
||
*/
|
||
|
||
#include <graphics.h>
|
||
|
||
int main(void)
|
||
{
|
||
int i, mx, my, cx, cy;
|
||
|
||
initgraph();
|
||
mx = getmaxx(); /* 319 */
|
||
my = getmaxy(); /* 255 */
|
||
cx = mx / 2;
|
||
cy = my / 2;
|
||
|
||
cleardevice();
|
||
|
||
/* Рамка по краю экрана. */
|
||
setcolor(WHITE);
|
||
rectangle(0, 0, mx, my);
|
||
|
||
/* Заголовок. */
|
||
setcolor(YELLOW);
|
||
outtextxy(88, 6, "SPRINTER BGI 256");
|
||
|
||
/* Палитровая полоса: 15 залитых баров цветами 1..15. */
|
||
for (i = 1; i <= 15; i++) {
|
||
int x0 = 8 + (i - 1) * 20;
|
||
setcolor(i);
|
||
bar(x0, 24, x0 + 16, 44);
|
||
}
|
||
|
||
/* Веер линий из центра к верхней кромке. */
|
||
for (i = 0; i <= mx; i += 16) {
|
||
setcolor(1 + (i / 16) % 15);
|
||
line(cx, cy, i, 52);
|
||
}
|
||
|
||
/* Вложенные окружности. */
|
||
for (i = 8; i < 90; i += 8) {
|
||
setcolor(9 + (i / 8) % 7);
|
||
circle(cx, cy, i);
|
||
}
|
||
|
||
/* Точечная диагональ (putpixel). */
|
||
for (i = 0; i < 60; i++)
|
||
putpixel(10 + i, 200 + i, LIGHTGREEN);
|
||
|
||
/* Подпись внизу текущей позицией (outtext). */
|
||
setcolor(LIGHTCYAN);
|
||
moveto(8, 240);
|
||
outtext("Phase 1: lines rects circles text");
|
||
|
||
for (;;) { } /* держим картинку на экране */
|
||
return 0;
|
||
}
|