/*
 * Copyright 2021 Google LLC.
 * Copyright 2022 Rive
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/renderer.hpp"
#include "rive/math/math_types.hpp"

using namespace rivegm;
using namespace rive;

class BatchedConvexPathsGM : public GM
{
public:
    BatchedConvexPathsGM() : GM(512, 512, "batchedconvexpaths") {}

private:
    ColorInt clearColor() const override { return 0xFF000000; }

    void onDraw(Renderer* canvas) override
    {
        for (uint32_t i = 0; i < 10; ++i)
        {
            canvas->save();

            int numPoints = (i + 3) * 3;
            Path path;
            path->moveTo(1, 0);
            for (float j = 1; j < numPoints; j += 3)
            {
                constexpr float k2PI = math::PI * 2;
                path->cubicTo(
                    cosf(j / numPoints * k2PI),
                    sinf(j / numPoints * k2PI),
                    cosf((j + 1) / numPoints * k2PI),
                    sinf((j + 1) / numPoints * k2PI),
                    j + 2 == numPoints ? 1 : cosf((j + 2) / numPoints * k2PI),
                    j + 2 == numPoints ? 0 : sinf((j + 2) / numPoints * k2PI));
            }
            float scale = 256 - i * 24;
            canvas->translate(scale + (256 - scale) * .33f,
                              scale + (256 - scale) * .33f);
            canvas->scale(scale, scale);

            Paint paint;
            paint->color(colorModulateOpacity(((i + 123458383u) * 285018463u) |
                                                  0xff808080,
                                              0.3f));

            canvas->drawPath(path, paint);

            canvas->restore();
        }
    }
};

GMREGISTER(return new BatchedConvexPathsGM;)
