libc: BGI Фаза 2d-3 — settextstyle (масштаб и направление текста)

settextstyle/gettextsettings/textwidth/textheight: DEFAULT_FONT 8×8,
целочисленный масштаб 1..10, HORIZ/VERT (поворот 90° CCW), прозрачный
фон. Свой scaled-рендер (_bgi_draw_scaled) читает глиф через leaf
_bgi_font_rows (interleaved системный шрифт) и рисует блоки size×size
raw в одной W3-скобке. outtext/outtextxy переведены на него. Проверено
в MAME (tests/bgitest): размеры 1..4 + вертикальный текст.

Доки обновлены (Ф2d-1/2/3 готовы; осталось viewport/клиппинг).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 16:18:48 +03:00
parent b26560c409
commit 657c6d2955
16 changed files with 210 additions and 45 deletions
+12
View File
@@ -76,6 +76,18 @@ 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);
/* ---- Стиль текста (_bgi_text_state.c) ---------------------------- */
extern uint8_t _bgi_text_dir; /* HORIZ_DIR / VERT_DIR */
extern uint8_t _bgi_text_size; /* масштаб 1..10 */
/* Заполнить 8 байт строк глифа символа c (грузит шрифт при первом
* использовании) — drv256/_bgi_font_rows.c. */
void _bgi_font_rows(unsigned char c, uint8_t *rows8);
/* Нарисовать строку s в (x,y) текущим стилем текста (масштаб/направление,
* цвет _bgi_fg, прозрачный фон) — _bgi_draw_scaled.c. */
void _bgi_draw_scaled(int x, int y, const char *s);
/* Залить строку [x0..x1] на y ТЕКУЩИМ стилем заливки (паттерн+цвет),
* с клипом по экрану. Вызывать между _bgi_begin/_bgi_end. */
void _bgi_fill_span(int x0, int x1, int y);
+48
View File
@@ -0,0 +1,48 @@
/*
* _bgi_draw_scaled — строка растровым шрифтом 8×8 с целочисленным
* масштабом и направлением, цветом _bgi_fg, прозрачным фоном.
*
* HORIZ_DIR: пиксель глифа (c,r) → экран (x+c*size, y+r*size).
* VERT_DIR (поворот 90° против часовой): (c,r) → (x+r*size, y-c*size).
* Каждый «пиксель» глифа — блок size×size из raw-плотов, всё в одной
* W3-скобке.
*/
#include "_bgi.h"
void _bgi_draw_scaled(int x, int y, const char *s)
{
uint8_t rows[8];
uint8_t b, fg, size, dir;
int r, c, bx, by, px, py;
fg = _bgi_fg;
size = _bgi_text_size ? _bgi_text_size : 1;
dir = _bgi_text_dir;
_bgi_begin();
while (*s) {
_bgi_font_rows((unsigned char)*s, rows);
for (r = 0; r < 8; r++) {
b = rows[r];
for (c = 0; c < 8; c++) {
if (!((b >> (7 - c)) & 1)) continue;
for (by = 0; by < size; by++) {
for (bx = 0; bx < size; bx++) {
if (dir == VERT_DIR) {
px = x + r * size + by;
py = y - c * size - bx;
} else {
px = x + c * size + bx;
py = y + r * size + by;
}
_bgi_plot_raw(px, py, fg);
}
}
}
}
if (dir == VERT_DIR) y -= 8 * size;
else x += 8 * size;
s++;
}
_bgi_end();
}
+8
View File
@@ -0,0 +1,8 @@
/*
* _bgi_text_state — направление и масштаб текста BGI.
* initgraph ставит HORIZ_DIR / size 1. Без инициализации.
*/
#include "_bgi.h"
uint8_t _bgi_text_dir;
uint8_t _bgi_text_size;
+17
View File
@@ -0,0 +1,17 @@
/*
* _bgi_font_rows (drv256) — 8 байт строк глифа символа c.
* Шрифт системный, interleaved: offset = row*256 + char (MSB-first),
* см. memory/sprinter_font_format. Грузится лениво (_gfx_font_ensure).
*/
#include "../_bgi.h"
#include "../../gfx/_gfx.h"
void _bgi_font_rows(unsigned char c, uint8_t *rows8)
{
const uint8_t *f;
int r;
_gfx_font_ensure();
f = _gfx_font_ptr;
for (r = 0; r < 8; r++)
rows8[r] = f[r * 256 + c];
}
+12
View File
@@ -0,0 +1,12 @@
/* gettextsettings — текущий стиль текста (justify не реализован → 0). */
#include "_bgi.h"
void gettextsettings(struct textsettingstype *textinfo)
{
if (!textinfo) return;
textinfo->font = DEFAULT_FONT;
textinfo->direction = _bgi_text_dir;
textinfo->charsize = _bgi_text_size;
textinfo->horiz = 0;
textinfo->vert = 0;
}
+2
View File
@@ -20,4 +20,6 @@ void initgraph(void)
_bgi_line_style = SOLID_LINE;
_bgi_line_thick = NORM_WIDTH;
_bgi_line_pattern = 0xFFFF;
_bgi_text_dir = HORIZ_DIR;
_bgi_text_size = 1;
}
+5 -5
View File
@@ -1,12 +1,12 @@
/*
* outtext — строка в текущей позиции (CP) текущим цветом; CP сдвигается
* вправо на ширину строки (шрифт 8×8, 8 пикселей на символ).
* outtext — строка в текущей позиции (CP) текущим стилем текста; CP
* сдвигается на textwidth (гориз.) или вверх на textheight (верт.).
*/
#include "_bgi.h"
#include <string.h>
void outtext(const char *text)
{
_bgi_drawtext(_bgi_cx, _bgi_cy, text, _bgi_fg, _bgi_bg);
_bgi_cx += (int)strlen(text) * 8;
_bgi_draw_scaled(_bgi_cx, _bgi_cy, text);
if (_bgi_text_dir == VERT_DIR) _bgi_cy -= textheight(text);
else _bgi_cx += textwidth(text);
}
+3 -2
View File
@@ -1,7 +1,8 @@
/* outtextxy — строка шрифтом 8×8 в (x,y) текущим цветом; CP не меняет. */
/* outtextxy — строка в (x,y) текущим стилем текста (масштаб/направление,
* прозрачный фон); CP не меняет. */
#include "_bgi.h"
void outtextxy(int x, int y, const char *text)
{
_bgi_drawtext(x, y, text, _bgi_fg, _bgi_bg);
_bgi_draw_scaled(x, y, text);
}
+12
View File
@@ -0,0 +1,12 @@
/*
* settextstyle — шрифт (поддержан только DEFAULT_FONT), направление и
* масштаб текста. font игнорируется (всегда растровый 8×8).
*/
#include "_bgi.h"
void settextstyle(int font, int direction, int charsize)
{
(void)font;
_bgi_text_dir = (direction == VERT_DIR) ? VERT_DIR : HORIZ_DIR;
_bgi_text_size = (charsize < 1) ? 1 : (charsize > 10 ? 10 : (uint8_t)charsize);
}
+9
View File
@@ -0,0 +1,9 @@
/* textheight — высота строки как она будет нарисована (масштаб/направление). */
#include "_bgi.h"
#include <string.h>
int textheight(const char *text)
{
if (_bgi_text_dir == VERT_DIR) return (int)strlen(text) * 8 * _bgi_text_size;
return 8 * _bgi_text_size;
}
+11
View File
@@ -0,0 +1,11 @@
/* textwidth — ширина строки как она будет нарисована (с учётом
* масштаба и направления). */
#include "_bgi.h"
#include <string.h>
int textwidth(const char *text)
{
int n = (int)strlen(text);
if (_bgi_text_dir == VERT_DIR) return 8 * _bgi_text_size;
return n * 8 * _bgi_text_size;
}