Files
Sprinter-SDCC/libc/bgi/_bgi.h
T
snark13 e761d21505 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>
2026-07-08 15:40:49 +03:00

52 lines
2.9 KiB
C

/*
* _bgi.h — внутренности BGI-слоя (НЕ публичный заголовок).
*
* Математика примитивов (circle/line/bar/…) — mode-agnostic, лежит в
* каталоге libc/bgi (файлы .c) и попадает в основную sprinter.lib.
* Различающиеся по видеорежиму LEAF-операции (`_bgi_*`) реализованы в
* отдельных driver-каталогах libc/bgi/drv256 и drv16 (каждый — свой архив, выбирается
* линковкой; см. memory/bgi_two_lib_design). Публичные символы leaf'ов
* одинаковы в обоих драйверах, поэтому math не знает режима.
*/
#ifndef _BGI_INTERNAL_H
#define _BGI_INTERNAL_H
#include <stdint.h>
#include <graphics.h>
/* ---- Состояние (_bgi_state.c) ------------------------------------ */
extern uint8_t _bgi_fg; /* текущий цвет рисования */
extern uint8_t _bgi_bg; /* фоновый цвет */
extern int _bgi_cx; /* текущая позиция X (CP) */
extern int _bgi_cy; /* текущая позиция Y */
extern int _bgi_maxx; /* правая граница (319) */
extern int _bgi_maxy; /* нижняя граница (255) */
extern int _bgi_maxcolor; /* макс. индекс цвета (255) */
extern uint8_t _bgi_prevmode; /* видеорежим до initgraph */
extern int _bgi_result; /* код graphresult */
/* ---- LEAF-операции драйвера (каталоги drv256 или drv16) ----------- *
* Каждая self-contained (сама оборачивает W3-скобку через gfx_*).
* mode_set: войти в граф.режим, загрузить палитру, заполнить
* _bgi_maxx/_bgi_maxy/_bgi_maxcolor; вернуть предыдущий видеорежим. */
uint8_t _bgi_mode_set(void);
void _bgi_mode_done(uint8_t prev_mode);
void _bgi_plot(int x, int y, uint8_t color);
unsigned _bgi_read(int x, int y);
/* Пакетное рисование: одна W3-скобка на весь примитив вместо скобки на
* каждый пиксель (для circle/ellipse/fill — тысячи точек). Между
* _bgi_begin и _bgi_end IRQ выключены; плот делать только _bgi_plot_raw
* (без своей скобки, с клипом по краю экрана). */
void _bgi_begin(void);
void _bgi_end(void);
void _bgi_plot_raw(int x, int y, uint8_t color);
void _bgi_hspan(int x, int y, int len, uint8_t color);
void _bgi_lineseg(int x0, int y0, int x1, int y1, uint8_t color);
void _bgi_fillrect(int x, int y, int w, int h, uint8_t color);
void _bgi_clearall(uint8_t color);
void _bgi_drawtext(int x, int y, const char *s, uint8_t fg, uint8_t bg);
#endif