4a081501d8
- bios/conio/env/errno/gfx/io/mem/mouse/stdio/stdlib/string/sys/time/ video разложены по модулям: общие статики и helpers — в internal _-модулях (_conio.h/_mouse.h/_gfx.h/_palette.h/_atexit.h/_time.h) - lib/Makefile: LIBC_C = wildcard libc/*/*.c — гранулярность файлов = гранулярность DCE линкера - эффект _CODE: gfx_text 6986→2568 Б, gfx_mous −1745, gfx_demo/d16 −542; ранее timedir −3270, ls −3098, stattest −2995 - комментарии оставшихся модулей переведены на русский; puts: убран мёртвый pchars; videomode_raw разложен на get/set - docs/libc-split-asm-cases.md — правила asm-связок между модулями; docs/libc-roadmap.md — план этапа - восстановлен examples/mdview/SAMPLE.MD (нужен make floppy) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
36 lines
1.1 KiB
C
36 lines
1.1 KiB
C
/*
|
|
* gfx_line16 — линия (x0,y0)-(x1,y1) (mode 0x82). Ортогональные —
|
|
* через hline/vline; наклонные — Брезенхэм с одной W3-скобкой.
|
|
*/
|
|
|
|
#include "_gfx.h"
|
|
|
|
void gfx_line16(int x0, int y0, int x1, int y1, uint8_t color)
|
|
{
|
|
if (y0 == y1) {
|
|
int x = x0 <= x1 ? x0 : x1;
|
|
int w = (x0 <= x1 ? x1 - x0 : x0 - x1) + 1;
|
|
gfx_hline16(x, y0, w, color);
|
|
return;
|
|
}
|
|
if (x0 == x1) {
|
|
int y = y0 <= y1 ? y0 : y1;
|
|
int h = (y0 <= y1 ? y1 - y0 : y0 - y1) + 1;
|
|
gfx_vline16(x0, y, h, color);
|
|
return;
|
|
}
|
|
int dx = x1 - x0; int sx = dx < 0 ? -1 : 1; if (dx < 0) dx = -dx;
|
|
int dy = y1 - y0; int sy = dy < 0 ? -1 : 1; if (dy < 0) dy = -dy;
|
|
int err = (dx > dy ? dx : -dy) / 2;
|
|
int x = x0, y = y0;
|
|
_gfx_w3_video_begin();
|
|
for (;;) {
|
|
_gfx_putpixel16_raw(x, y, color);
|
|
if (x == x1 && y == y1) break;
|
|
int e2 = err;
|
|
if (e2 > -dx) { err -= dy; x += sx; }
|
|
if (e2 < dy) { err += dx; y += sy; }
|
|
}
|
|
_gfx_w3_video_end();
|
|
}
|