| /* | |
| * 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()) |