/*
 * _bgi_ellipse_arc — контур дуги/эллипса полилинией.
 *
 * Точки параметризованы углом (BGI: 0°=восток, против часовой, ось Y
 * вниз): px = cx + xr*cos(a), py = cy - yr*sin(a).  Соседние выборки
 * соединяются отрезками — контур сплошной при любом радиусе.
 *
 * Тригонометрия в Q7 (×128): xr*cos128 ≤ 255×128 < 32767, помещается в
 * int — БЕЗ 32-битной арифметики (её SDCC/Z80 собирает криво: раньше
 * эллипс через (long)…>>8 рисовался прямоугольником).
 */

#include "../_bgi.h"

void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle,
                      int xr, int yr, uint8_t color)
{
    int a, x, y, px, py, first;

    if (endangle < stangle) endangle += 360;   /* дуга через 0° */

    px = 0;
    py = 0;
    first = 1;
    for (a = stangle; a <= endangle; a++) {
        x = cx + ((xr * _bgi_cos128(a)) >> 7);
        y = cy - ((yr * _bgi_sin128(a)) >> 7);
        if (!first) _bgi_lineseg(px, py, x, y, color);
        px = x;
        py = y;
        first = 0;
    }
}
