/*
 * fillellipse — залитый эллипс с полуосями rx,ry, центр (cx,cy).
 * Нутро — текущим стилем заливки, контур — текущим цветом.
 *
 * По строкам: полуширина w = rx*sqrt(ry²-dy²)/ry (целочисленно через
 * _bgi_isqrt).  ry²,dy² ≤ ~180² < 32767, rx*s ≤ rx*ry < 32767 — без
 * 32-бит (см. memory/avoid_32bit_arith_z80).
 */
#include "../_bgi.h"

void fillellipse(int cx, int cy, int rx, int ry)
{
    int dy, s, w;

    if (rx < 0 || ry < 0) return;

    _bgi_begin();
    if (ry == 0) {
        _bgi_fill_span(cx - rx, cx + rx, cy);
    } else {
        for (dy = -ry; dy <= ry; dy++) {
            s = _bgi_isqrt(ry * ry - dy * dy);   /* 0..ry */
            w = (rx * s) / ry;
            _bgi_fill_span(cx - w, cx + w, cy + dy);
        }
    }
    _bgi_end();

    /* Контур текущим цветом. */
    ellipse(cx, cy, 0, 360, rx, ry);
}
