libc: graphics.h — Turbo-C BGI-слой, Фаза 1 (режим 256)
Функционально-совместимый с 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>
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
PROJ_ROOT := $(abspath $(CURDIR)/../..)
|
||||
EXAMPLE := bgitest
|
||||
EXTRA_FLAGS := --gfx 256
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user