/*
 * Copyright 2022 Rive
 */

#include "gm.hpp"
#include "gmutils.hpp"

using namespace rivegm;

class OvalGM : public GM
{
public:
    OvalGM() : GM(410, 410, "oval") {}

    void onDraw(rive::Renderer* ren) override
    {
        Paint paint;

        paint->color(0xFFFF0000);
        draw_oval(ren, {10, 10, 100, 50}, paint.get());
        paint->color(0xFF00FF00);
        draw_oval(ren, {10, 60, 50, 200}, paint.get());

        rive::AABB r = {70, 70, 200, 200};
        paint->color(0xFF0000FF);

        Path path;
        path_addOval(path, r, PathDirection::cw);
        path_addOval(path, r.inset(20, 20), PathDirection::ccw);
        ren->drawPath(path, paint);

        path = Path();
        r = {210, 10, 210 + 100, 10 + 100};
        path_addOval(path, r);
        path_addOval(path, r.offset(80, 30));
        path_addOval(path, r.offset(30, 80));
        paint->color(0xFFCC8844);
        ren->drawPath(path, paint);

        ren->translate(-95, 205);
        path->fillRule(rive::FillRule::evenOdd);
        paint->color(0xFF4488CC);
        ren->drawPath(path, paint);
    }
};
GMREGISTER(return new OvalGM)
