blob: 38232f54a1d9371ce3a1d3bf85b7182af0a4bac1 [file] [log] [blame] [edit]
/*
* Copyright 2023 Rive
*/
#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/math/math_types.hpp"
#include "rive/renderer.hpp"
#include "common/rand.hpp"
using namespace rivegm;
using namespace rive;
constexpr static int kNumRows = 3;
// Ensures that rectangular clips (which are handled as clipRects) get rendered
// correctly.
class ClipRectsGM : public GM
{
public:
ClipRectsGM() : GM(200 * 3, 200 * kNumRows) {}
void onDraw(rive::Renderer* renderer) override
{
Rand rand;
Factory* factory = TestingWindow::Get()->factory();
Paint outerPaint;
outerPaint->color(0xe0102040);
Paint innerPaint;
for (size_t i = 0; i < kNumRows; ++i)
{
AABB outerRect =
AABB::fromLTWH(25.f, 25.f + 200.f * i, 150.f, 150.f);
AABB innerRect = outerRect.inset(5, 5);
if (i == kNumRows - 1)
{
renderer->translate(0, outerRect.center().y * 2);
renderer->scale(1, -1);
}
auto outerPath = factory->makeEmptyRenderPath();
outerPath->addRect(outerRect.left(),
outerRect.top(),
outerRect.width(),
outerRect.height());
auto innerPath = factory->makeEmptyRenderPath();
innerPath->addRect(innerRect.left(),
innerRect.top(),
innerRect.width(),
innerRect.height());
renderer->save();
renderer->save();
renderer->drawPath(outerPath.get(), outerPaint);
innerPaint->color(rand.u32() | 0xff808080);
renderer->clipPath(innerPath.get());
renderer->drawPath(outerPath.get(), innerPaint);
renderer->restore();
renderer->translate(200, 0);
renderer->save();
renderer->translate(outerRect.center().x, outerRect.center().y);
renderer->rotate(rive::math::PI / 8);
renderer->translate(-outerRect.center().x, -outerRect.center().y);
renderer->drawPath(outerPath.get(), outerPaint);
innerPaint->color(rand.u32() | 0xff808080);
renderer->clipPath(innerPath.get());
renderer->drawPath(outerPath.get(), innerPaint);
renderer->restore();
renderer->translate(200, 0);
renderer->save();
renderer->translate(outerRect.center().x, outerRect.center().y);
renderer->transform(Mat2D{.9f, .1f, -.3f, .7f, 0, 0});
renderer->translate(-outerRect.center().x, -outerRect.center().y);
renderer->drawPath(outerPath.get(), outerPaint);
innerPaint->color(rand.u32() | 0xff808080);
renderer->clipPath(innerPath.get());
renderer->drawPath(outerPath.get(), innerPaint);
renderer->restore();
renderer->restore();
}
}
};
GMREGISTER(cliprects, return new ClipRectsGM())