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