libbgi: тривиальные аксессоры → inline в заголовках (17 модулей удалено)
setcolor/getcolor/setbkcolor/getbkcolor/getmaxx/getmaxy/getmaxcolor/
getx/gety/moveto/moverel/setfillstyle/graphresult (graphics.h) и
gfx_get_bank/gfx_set_bank/gfx_get_draw_page/gfx_get_visible_page
(gfx.h) определены inline в публичных заголовках; state-переменные
объявлены там же (хранилище прежнее — _bgi_state.c/_gfx_state.c).
Именно `inline` БЕЗ static: проверено артефактами (.asm) — SDCC 4.5
инлайнит вызов при всех наших флагах (--opt-code-size/--opt-code-speed/
--max-allocs) и не эмитит standalone-тело; `static inline` эмитил бы
мёртвую копию каждого аксессора в КАЖДЫЙ включивший модуль. Отказ
инлайнить = громкая ошибка линковки (все 47 программ слинковались).
Экономия ~30-40Т на вызов, минус 17 .rel; по _CODE размер-нейтрально
(сайт вызова ≈ телу). size_baseline: bgitest +267/accfill +528 — это
НЕ inline, а run-рендер текста из ba09c0b (draw_scaled потянул
vspan_raw+vfill256 и сам вырос) — цена за ~2-6× скорость текста.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -38,12 +38,16 @@
|
||||
#define GFX_COLORS_16 16
|
||||
|
||||
/* ---- Page selection (double-buffering) and bank control ---------- */
|
||||
/* Внутреннее состояние (хранилище: libbgi/common/_gfx_state.c) — НЕ
|
||||
* трогать напрямую, только через функции ниже. */
|
||||
extern uint8_t _gfx_visible_page, _gfx_draw_page, _gfx_bank;
|
||||
|
||||
void gfx_set_visible_page(uint8_t page); /* 0 or 1 */
|
||||
uint8_t gfx_get_visible_page(void);
|
||||
inline uint8_t gfx_get_visible_page(void) { return _gfx_visible_page; }
|
||||
void gfx_set_draw_page(uint8_t page); /* 0 or 1 */
|
||||
uint8_t gfx_get_draw_page(void);
|
||||
void gfx_set_bank(uint8_t bank); /* 0x50..0x5F */
|
||||
uint8_t gfx_get_bank(void);
|
||||
inline uint8_t gfx_get_draw_page(void) { return _gfx_draw_page; }
|
||||
inline void gfx_set_bank(uint8_t bank) { _gfx_bank = bank; } /* 0x50..0x5F */
|
||||
inline uint8_t gfx_get_bank(void) { return _gfx_bank; }
|
||||
|
||||
/* Block until the next frame (50 Hz). Типичный double-buffer:
|
||||
* gfx_set_draw_page(hidden); draw_frame(); gfx_wait_vsync();
|
||||
|
||||
+41
-13
@@ -41,6 +41,21 @@ typedef uint8_t color_t;
|
||||
#define grNoInitGraph (-1)
|
||||
#define grError (-11)
|
||||
|
||||
/* ---- Внутреннее состояние BGI ------------------------------------- *
|
||||
* НЕ трогать напрямую — только через функции ниже. Объявлено здесь,
|
||||
* чтобы тривиальные аксессоры были inline (без call/ret и без
|
||||
* .rel-модуля на каждый геттер). Именно `inline` БЕЗ static: SDCC
|
||||
* инлайнит вызов и НЕ эмитит standalone-тело (static inline эмитил бы
|
||||
* мёртвую копию в каждый включивший модуль — проверено 2026-07-10);
|
||||
* если SDCC когда-нибудь откажется инлайнить — будет громкая ошибка
|
||||
* линковки, не тихая деградация. Хранилище — libbgi/common/
|
||||
* _bgi_state.c и _bgi_fill_state.c. */
|
||||
extern uint8_t _bgi_fg, _bgi_bg;
|
||||
extern int _bgi_cx, _bgi_cy;
|
||||
extern int _bgi_maxx, _bgi_maxy, _bgi_maxcolor;
|
||||
extern int _bgi_result;
|
||||
extern uint8_t _bgi_fill_pattern, _bgi_fill_color;
|
||||
|
||||
/* ---- Setup / teardown -------------------------------------------- */
|
||||
|
||||
/* Перейти в графический режим (для этой либы — 320×256×256), загрузить
|
||||
@@ -52,21 +67,28 @@ void initgraph(void);
|
||||
void closegraph(void);
|
||||
|
||||
/* Код последней ошибки; вызов сбрасывает его в grOk (как в BGI). */
|
||||
int graphresult(void);
|
||||
inline int graphresult(void)
|
||||
{
|
||||
int r = _bgi_result;
|
||||
_bgi_result = grOk;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Очистить экран фоновым цветом и вернуть позицию в (0,0). */
|
||||
void cleardevice(void);
|
||||
|
||||
/* ---- Границы и цвета --------------------------------------------- */
|
||||
|
||||
int getmaxx(void); /* 319 */
|
||||
int getmaxy(void); /* 255 */
|
||||
color_t getmaxcolor(void); /* 255 */
|
||||
inline int getmaxx(void) { return _bgi_maxx; } /* 319 */
|
||||
inline int getmaxy(void) { return _bgi_maxy; } /* 255 */
|
||||
inline color_t getmaxcolor(void) { return (color_t)_bgi_maxcolor; } /* 255 */
|
||||
|
||||
void setcolor(color_t color); /* текущий цвет рисования */
|
||||
color_t getcolor(void);
|
||||
void setbkcolor(color_t color); /* фоновый цвет (для cleardevice/текста) */
|
||||
color_t getbkcolor(void);
|
||||
/* текущий цвет рисования */
|
||||
inline void setcolor(color_t color) { _bgi_fg = (uint8_t)color; }
|
||||
inline color_t getcolor(void) { return _bgi_fg; }
|
||||
/* фоновый цвет (для cleardevice/текста) */
|
||||
inline void setbkcolor(color_t color) { _bgi_bg = (uint8_t)color; }
|
||||
inline color_t getbkcolor(void) { return _bgi_bg; }
|
||||
|
||||
/* ---- Точки ------------------------------------------------------- */
|
||||
|
||||
@@ -75,10 +97,12 @@ color_t 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);
|
||||
/* задать текущую позицию (CP) */
|
||||
inline void moveto(int x, int y) { _bgi_cx = x; _bgi_cy = y; }
|
||||
/* сдвинуть CP относительно */
|
||||
inline void moverel(int dx, int dy) { _bgi_cx += dx; _bgi_cy += dy; }
|
||||
inline int getx(void) { return _bgi_cx; }
|
||||
inline int gety(void) { return _bgi_cy; }
|
||||
|
||||
void lineto(int x, int y); /* линия CP→(x,y), CP := (x,y) */
|
||||
void linerel(int dx, int dy); /* линия CP→CP+(dx,dy), CP сдвигается */
|
||||
@@ -124,7 +148,11 @@ enum {
|
||||
|
||||
struct fillsettingstype { int pattern; color_t color; };
|
||||
|
||||
void setfillstyle(int pattern, color_t color);
|
||||
inline void setfillstyle(int pattern, color_t color)
|
||||
{
|
||||
_bgi_fill_pattern = (uint8_t)pattern;
|
||||
_bgi_fill_color = (uint8_t)color;
|
||||
}
|
||||
void getfillsettings(struct fillsettingstype *fillinfo);
|
||||
|
||||
/* bar — залитый прямоугольник (текущий стиль заливки, без рамки). */
|
||||
|
||||
Reference in New Issue
Block a user