/*
 * circle — окружность (midpoint) с центром (cx,cy) радиуса r,
 * текущим цветом.  Целочисленный алгоритм, 8 октантов за шаг.
 *
 * Вся окружность рисуется в ОДНОЙ W3-скобке (_bgi_begin/_bgi_end) +
 * raw-плот — иначе скобка на каждый пиксель делает большие окружности
 * мучительно медленными (тысячи DI/EI).
 */
#include "../_bgi.h"

void circle(int cx, int cy, int r)
{
    int x, y, d;
    uint8_t c = _bgi_fg;

    if (r < 0) return;

    x = 0;
    y = r;
    d = 1 - r;
    _bgi_begin();
    while (x <= y) {
        _bgi_plot_raw(cx + x, cy + y, c);
        _bgi_plot_raw(cx - x, cy + y, c);
        _bgi_plot_raw(cx + x, cy - y, c);
        _bgi_plot_raw(cx - x, cy - y, c);
        _bgi_plot_raw(cx + y, cy + x, c);
        _bgi_plot_raw(cx - y, cy + x, c);
        _bgi_plot_raw(cx + y, cy - x, c);
        _bgi_plot_raw(cx - y, cy - x, c);
        if (d < 0) {
            d += 2 * x + 3;
        } else {
            d += 2 * (x - y) + 5;
            y--;
        }
        x++;
    }
    _bgi_end();
}
