b26560c409
setlinestyle/getlinesettings: SOLID/DOTTED/CENTER/DASHED/USERBIT + NORM/THICK. _bgi_styled_line — Брезенхэм с 16-битной маской (пропуск пикселя по биту) и дублированием ±1 перпендикулярно оси для THICK; SOLID+NORM идёт быстрым путём (accel _bgi_lineseg). line/lineto/linerel/ rectangle/drawpoly переведены на него. Проверено в MAME (tests/bgitest). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
96 lines
5.2 KiB
C
96 lines
5.2 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>
|
||
#include <gfx.h> /* 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_line_state.c) ------------------------- */
|
||
extern uint8_t _bgi_line_style; /* SOLID_LINE..USERBIT_LINE */
|
||
extern uint8_t _bgi_line_thick; /* 1 (NORM) или 3 (THICK) */
|
||
extern uint16_t _bgi_line_pattern; /* маска для USERBIT_LINE */
|
||
|
||
/* Отрезок текущим стилем/толщиной линии (_bgi_styled_line.c). */
|
||
void _bgi_styled_line(int x0, int y0, int x1, int y1, uint8_t color);
|
||
|
||
/* ---- Состояние заливки (_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
|