/* * gfx_line256 — линия (x0,y0)-(x1,y1) (mode 0x81). Ортогональные * уходят на акселератор; наклонные — Брезенхэм с одной W3-скобкой * вокруг всего цикла. */ #include "_gfx.h" void gfx_line256(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_hline256(x, y0, w, color); return; } if (x0 == x1) { int y = y0 <= y1 ? y0 : y1; int h = (y0 <= y1 ? y1 - y0 : y0 - y1) + 1; gfx_vline256(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_putpixel256_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(); }