/* * 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); /* окружность */ /* ---- Текст ------------------------------------------------------- * * Шрифт 8×8 (системный). Рисуется текущим цветом на фоновом. */ void outtextxy(int x, int y, const char *text); /* в (x,y), CP не меняет */ void outtext(const char *text); /* в CP; CP сдвигается вправо */ #endif