| /* |
| * Copyright 2023 Rive |
| */ |
| |
| #include "gm.hpp" |
| #include "gmutils.hpp" |
| #include "rive/math/math_types.hpp" |
| #include "rive/renderer.hpp" |
| |
| using namespace rivegm; |
| using namespace rive; |
| |
| // Ensures clipRect intersections are rendered properly, including the case |
| // where the clipRect goes negative and nothing should get drawn. |
| class CLipRectIntersectionsGM : public GM |
| { |
| public: |
| CLipRectIntersectionsGM() : GM(150 + 120 * 3, 685) {} |
| |
| ColorInt clearColor() const override { return 0xff000000; } |
| |
| void onDraw(rive::Renderer* renderer) override |
| { |
| Paint cyan; |
| cyan->color(0xff00ffff); |
| |
| Paint green; |
| green->color(0xff00ff00); |
| |
| Paint red; |
| red->color(0xffff0000); |
| |
| Paint stroke; |
| stroke->style(RenderPaintStyle::stroke); |
| stroke->color(0xb0ffffff); |
| stroke->thickness(4); |
| stroke->join(StrokeJoin::bevel); |
| |
| Path rect; |
| rect->addRect(10, 10, 100, 100); |
| |
| Path fullscreen; |
| fullscreen->addRect(-1e6, -1e6, 2e6, 2e6); |
| |
| float offsets[] = {0, 75, 150}; |
| |
| renderer->save(); |
| for (size_t i = 0; i < 3; ++i) |
| { |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->drawPath(rect, cyan); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->translate(offsets[i], 0); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, cyan); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->translate(offsets[i], 0); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, i != 2 ? green : red); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->drawPath(rect, stroke); |
| renderer->translate(offsets[i], 0); |
| renderer->drawPath(rect, stroke); |
| renderer->restore(); |
| |
| renderer->translate(0, 120); |
| } |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->translate(150, 0); |
| Paint majenta; |
| majenta->color(0xffff00ff); |
| for (size_t i = 0; i < 3; ++i) |
| { |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->drawPath(rect, majenta); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->translate(0, offsets[i]); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, majenta); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->translate(0, offsets[i]); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, i != 2 ? green : red); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->drawPath(rect, stroke); |
| renderer->translate(0, offsets[i]); |
| renderer->drawPath(rect, stroke); |
| renderer->restore(); |
| |
| renderer->translate(120, 0); |
| } |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->translate(0, 370); |
| Paint yellow; |
| majenta->color(0xffffff00); |
| for (size_t i = 0; i < 3; ++i) |
| { |
| renderer->save(); |
| |
| if (i == 1) |
| { |
| renderer->translate(0, 120); |
| } |
| else if (i == 2) |
| { |
| renderer->translate(120, 0); |
| } |
| |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->drawPath(rect, majenta); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->translate(offsets[i], offsets[i]); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, majenta); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->clipPath(rect); |
| renderer->translate(offsets[i], offsets[i]); |
| renderer->clipPath(rect); |
| renderer->drawPath(fullscreen, i != 2 ? green : red); |
| renderer->restore(); |
| |
| renderer->save(); |
| renderer->drawPath(rect, stroke); |
| renderer->translate(offsets[i], offsets[i]); |
| renderer->drawPath(rect, stroke); |
| renderer->restore(); |
| |
| renderer->restore(); |
| } |
| renderer->restore(); |
| } |
| }; |
| |
| GMREGISTER(cliprectintersections, return new CLipRectIntersectionsGM()) |