/* * 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(); }