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