/*
 * fillpoly — залитый многоугольник по numpoints точкам {x0,y0,…}.
 * Нутро — текущим стилем заливки, контур — текущим цветом.  Полигон
 * авто-замыкается (последняя точка соединяется с первой).
 *
 * Заливка: для каждой строки берём крайние X контура (min/max) и
 * заполняем между ними — точно для выпуклых, для вогнутых = выпуклая
 * оболочка по строкам (упрощение).  Крайние X даёт брезенхэмовский
 * проход рёбер (_bgi_poly_edge) — без 32-бит арифметики.
 */
#include "../_bgi.h"

void fillpoly(int numpoints, const int *polypoints)
{
    int i, j, y, ymin, ymax, xa, ya, xb, yb;

    if (numpoints < 2) return;

    ymin = 32767;
    ymax = -32768;
    for (i = 0; i < numpoints; i++) {
        y = polypoints[2 * i + 1];
        if (y < ymin) ymin = y;
        if (y > ymax) ymax = y;
    }
    if (ymin < 0) ymin = 0;
    if (ymax > GFX_HEIGHT - 1) ymax = GFX_HEIGHT - 1;
    if (ymax < ymin) return;

    for (y = ymin; y <= ymax; y++) {
        _bgi_span_min[y] = 32767;
        _bgi_span_max[y] = -32768;
    }

    for (i = 0; i < numpoints; i++) {
        j = (i + 1) % numpoints;
        _bgi_poly_edge(polypoints[2 * i], polypoints[2 * i + 1],
                       polypoints[2 * j], polypoints[2 * j + 1]);
    }

    _bgi_begin();
    for (y = ymin; y <= ymax; y++)
        if (_bgi_span_max[y] >= _bgi_span_min[y])
            _bgi_fill_span(_bgi_span_min[y], _bgi_span_max[y], y);
    _bgi_end();

    /* Контур текущим цветом (замкнутый). */
    for (i = 0; i < numpoints; i++) {
        j = (i + 1) % numpoints;
        xa = polypoints[2 * i]; ya = polypoints[2 * i + 1];
        xb = polypoints[2 * j]; yb = polypoints[2 * j + 1];
        _bgi_lineseg(xa, ya, xb, yb, _bgi_fg);
    }
}
