/* * _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 #include #include /* GFX_WIDTH/HEIGHT для внутренних таблиц */ /* ---- Состояние (_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); /* ---- Тригонометрия для дуг (_bgi_trig.c) ------------------------- * * Угол в градусах; результат sin/cos × 128 (Q7 — чтобы радиус×значение * влезало в int без 32-бит арифметики). */ int _bgi_sin128(int deg); int _bgi_cos128(int deg); /* Общий рисователь дуги/контура эллипса (_bgi_arc_draw.c): полилиния * по точкам от stangle до endangle с полуосями xr,yr вокруг (cx,cy). */ void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle, int xr, int yr, uint8_t color); /* Целочисленный sqrt (0..~32767) для fillellipse (_bgi_isqrt.c). */ int _bgi_isqrt(int n); /* ---- Состояние заливки (_bgi_fill_state.c) ----------------------- */ extern uint8_t _bgi_fill_pattern; /* *_FILL */ extern uint8_t _bgi_fill_color; /* Raw horizontal span (без своей W3-скобки; клип делает сам gfx-raw). */ void _bgi_hspan_raw(int x, int y, int len, uint8_t color); /* Raw чтение пикселя (без своей W3-скобки) — для getimage/putimage. */ unsigned _bgi_read_raw(int x, int y); /* Залить строку [x0..x1] на y ТЕКУЩИМ стилем заливки (паттерн+цвет), * с клипом по экрану. Вызывать между _bgi_begin/_bgi_end. */ void _bgi_fill_span(int x0, int x1, int y); /* Скан-таблицы min/max X по строкам для fillpoly (_bgi_poly_state.c). */ extern int _bgi_span_min[GFX_HEIGHT]; extern int _bgi_span_max[GFX_HEIGHT]; /* Прогнать ребро (Брезенхэм) обновляя _bgi_span_min/max (_bgi_poly_edge.c). */ void _bgi_poly_edge(int x0, int y0, int x1, int y1); 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