/* * _bgi_poly_edge — прогнать ребро (x0,y0)->(x1,y1) по Брезенхэму, * обновляя _bgi_span_min/_bgi_span_max для каждой затронутой строки. * Только целочисленные сложения (без 32-бит). Строки вне экрана * пропускаются. Заливка потом идёт от min до max по строке. */ #include "_bgi.h" void _bgi_poly_edge(int x0, int y0, int x1, int y1) { int dx, dy, sx, sy, err, e2; dx = x1 - x0; if (dx < 0) dx = -dx; dy = y1 - y0; if (dy < 0) dy = -dy; sx = (x0 < x1) ? 1 : -1; sy = (y0 < y1) ? 1 : -1; err = dx - dy; for (;;) { if (y0 >= 0 && y0 < GFX_HEIGHT) { if (x0 < _bgi_span_min[y0]) _bgi_span_min[y0] = x0; if (x0 > _bgi_span_max[y0]) _bgi_span_max[y0] = x0; } if (x0 == x1 && y0 == y1) break; e2 = 2 * err; if (e2 > -dy) { err -= dy; x0 += sx; } if (e2 < dx) { err += dx; y0 += sy; } } }