5a48f7fafb
Дуги/эллипсы через целочисленную тригонометрию Q7 (_bgi_trig.c, ×128) + общий рисователь полилинией (_bgi_arc_draw.c). arc(x,y,st,end,r), ellipse(x,y,st,end,xr,yr), drawpoly(n,pts). Проверено в MAME (tests/ bgitest): окружность/эллипс/дуга/полигон рисуются корректно. ВАЖНО: тригонометрию считаем в int (Q7), НЕ через (long)…>>8 — первая версия на 32-бит арифметике рисовала эллипс прямоугольником (SDCC/z80 криво собирает 32-бит; см. memory/avoid_32bit_arith_z80). Q7 даёт радиус×значение ≤ 255×128 < 32767 — всё влезает в 16 бит. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
103 lines
5.2 KiB
C
103 lines
5.2 KiB
C
/*
|
||
* graphics.h — Turbo-C-совместимый (функционально) BGI-слой для Sprinter.
|
||
*
|
||
* Слой поверх низкоуровневого gfx.h. Состояние (текущий цвет, позиция,
|
||
* границы экрана) хранится внутри — как в оригинальном BGI, где функции
|
||
* рисуют «текущим» цветом от «текущей» позиции.
|
||
*
|
||
* РЕЖИМ фиксируется на этапе ЛИНКОВКИ выбором driver-библиотеки:
|
||
* sprinter-cc --gfx 256 → 320×256×256 (эта версия)
|
||
* (--gfx 16 → 640×256×16 будет позже; API идентичен, менять код не надо)
|
||
* Одновременно два режима использовать нельзя.
|
||
*
|
||
* Отличия от Turbo-C (функциональная, а не буквальная совместимость):
|
||
* - initgraph() без аргументов-указателей на драйвер: драйвер задан
|
||
* линковкой, грузить .bgi-файл с диска не нужно.
|
||
* - в 256-режиме initgraph() загружает EGA-совместимые цвета 0..15 в
|
||
* палитру, так что setcolor(RED) и т.п. работают как в Turbo-C;
|
||
* индексы 16..255 свободны под свои цвета (getmaxcolor() = 255).
|
||
* - fill-паттерны/стили линий/стили текста — Фаза 2 (пока bar/bar-подобное
|
||
* заливается текущим цветом, линии сплошные, текст 8×8).
|
||
*/
|
||
|
||
#ifndef GRAPHICS_H
|
||
#define GRAPHICS_H
|
||
|
||
/* ---- Стандартные EGA/VGA цвета (индексы палитры 0..15) ------------ */
|
||
enum {
|
||
BLACK = 0, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,
|
||
DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,
|
||
YELLOW, WHITE
|
||
};
|
||
|
||
/* ---- Коды graphresult() ------------------------------------------ */
|
||
#define grOk 0
|
||
#define grNoInitGraph (-1)
|
||
#define grError (-11)
|
||
|
||
/* ---- Setup / teardown -------------------------------------------- */
|
||
|
||
/* Перейти в графический режим (для этой либы — 320×256×256), загрузить
|
||
* EGA-палитру, сбросить состояние: цвет = WHITE, фон = BLACK, текущая
|
||
* позиция = (0,0). Предыдущий видеорежим запоминается для closegraph. */
|
||
void initgraph(void);
|
||
|
||
/* Вернуться в текстовый режим, действовавший до initgraph(). */
|
||
void closegraph(void);
|
||
|
||
/* Код последней ошибки; вызов сбрасывает его в grOk (как в BGI). */
|
||
int graphresult(void);
|
||
|
||
/* Очистить экран фоновым цветом и вернуть позицию в (0,0). */
|
||
void cleardevice(void);
|
||
|
||
/* ---- Границы и цвета --------------------------------------------- */
|
||
|
||
int getmaxx(void); /* 319 */
|
||
int getmaxy(void); /* 255 */
|
||
int getmaxcolor(void); /* 255 */
|
||
|
||
void setcolor(int color); /* текущий цвет рисования */
|
||
int getcolor(void);
|
||
void setbkcolor(int color); /* фоновый цвет (для cleardevice/текста) */
|
||
int getbkcolor(void);
|
||
|
||
/* ---- Точки ------------------------------------------------------- */
|
||
|
||
void putpixel(int x, int y, int color);
|
||
unsigned getpixel(int x, int y);
|
||
|
||
/* ---- Текущая позиция и линии ------------------------------------- */
|
||
|
||
void moveto(int x, int y); /* задать текущую позицию (CP) */
|
||
void moverel(int dx, int dy); /* сдвинуть CP относительно */
|
||
int getx(void);
|
||
int gety(void);
|
||
|
||
void lineto(int x, int y); /* линия CP→(x,y), CP := (x,y) */
|
||
void linerel(int dx, int dy); /* линия CP→CP+(dx,dy), CP сдвигается */
|
||
void line(int x1, int y1, int x2, int y2); /* линия, CP не меняет */
|
||
|
||
/* ---- Фигуры ------------------------------------------------------ */
|
||
|
||
void rectangle(int left, int top, int right, int bottom); /* контур */
|
||
void bar(int left, int top, int right, int bottom); /* заливка */
|
||
void circle(int x, int y, int radius); /* окружность */
|
||
|
||
/* Дуги/эллипсы: угол в градусах, 0°=восток, против часовой стрелки.
|
||
* Полный эллипс — ellipse(x,y,0,360,xr,yr). */
|
||
void arc(int x, int y, int stangle, int endangle, int radius);
|
||
void ellipse(int x, int y, int stangle, int endangle,
|
||
int xradius, int yradius);
|
||
|
||
/* Ломаная по numpoints точкам {x0,y0,x1,y1,…}; НЕ замыкается сама. */
|
||
void drawpoly(int numpoints, const int *polypoints);
|
||
|
||
/* ---- Текст ------------------------------------------------------- *
|
||
* Шрифт 8×8 (системный). Рисуется текущим цветом на фоновом. */
|
||
|
||
void outtextxy(int x, int y, const char *text); /* в (x,y), CP не меняет */
|
||
void outtext(const char *text); /* в CP; CP сдвигается вправо */
|
||
|
||
#endif
|