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