blob: 8a0f6534ae2e809a339ae05d1d866817a08c3450 [file] [log] [blame] [edit]
/*
* Copyright 2024 Rive
*/
#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/math/math_types.hpp"
using namespace rivegm;
namespace rive::gpu
{
// Draws non-overlapping clips, which will get reordered and batched together in
// atomic and msaa modes.
class ParallelClipsGM : public GM
{
public:
ParallelClipsGM() : GM(850, 850) {}
ColorInt clearColor() const override { return 0xff000000; }
void onDraw(Renderer* renderer) override
{
for (uint32_t y = 0; y < 7; ++y)
{
renderer->save();
for (uint32_t x = 0; x < 7; ++x)
{
bool nested = (x ^ y) & 1;
renderer->save();
{
PathBuilder clip;
clip.addRect({10, 10, 110, 110},
rivegm::PathDirection::counterclockwise);
clip.moveTo(cos(math::PI / 2) * 30 + 60,
sin(math::PI / 2) * 30 + 60)
.lineTo(cos(2 * math::PI / 3 + math::PI / 2) * 30 + 60,
sin(2 * math::PI / 3 + math::PI / 2) * 30 + 60)
.lineTo(cos(4 * math::PI / 3 + math::PI / 2) * 30 + 60,
sin(4 * math::PI / 3 + math::PI / 2) * 30 + 60);
renderer->clipPath(clip.detach());
}
if (nested)
{
PathBuilder clip;
clip.addRect({10, 10, 110, 110},
rivegm::PathDirection::counterclockwise);
clip.addRect({55, 10, 65, 110},
rivegm::PathDirection::clockwise);
renderer->clipPath(clip.detach());
}
if (nested)
{
PathBuilder clip;
clip.addRect({10, 10, 110, 110},
rivegm::PathDirection::counterclockwise);
clip.addRect({10, 55, 110, 65},
rivegm::PathDirection::clockwise);
renderer->clipPath(clip.detach());
}
renderer->drawPath(
PathBuilder::Circle(60, 60, 50),
Paint(((y * x + 123458383u) * 285018463u) | 0xff808080));
renderer->restore();
renderer->translate(120, 0);
}
renderer->restore();
renderer->translate(0, 120);
}
}
};
GMREGISTER(parallelclips, return new ParallelClipsGM)
} // namespace rive::gpu