| /* | |
| * Copyright 2024 Rive | |
| */ | |
| #include "gm.hpp" | |
| #include "gmutils.hpp" | |
| #include "rive/math/math_types.hpp" | |
| using namespace rivegm; | |
| namespace rive::gpu | |
| { | |
| // Verifies that fill rules still get drawn properly when the content | |
| // interleaves them. | |
| class InterleavedFillRuleGM : public GM | |
| { | |
| public: | |
| InterleavedFillRuleGM() : GM(1700, 1700) {} | |
| ColorInt clearColor() const override { return 0xff000000; } | |
| void onDraw(Renderer* renderer) override | |
| { | |
| renderer->scale(2, 2); | |
| std::vector<Path> stars; | |
| for (uint32_t x = 0; x < 7; ++x) | |
| { | |
| Path& path = stars.emplace_back(); | |
| uint32_t n = 5 + x; | |
| if (n >= 8) | |
| { | |
| ++n; | |
| } | |
| if (n % 3 == 0 && !((n / 3) & 1)) | |
| { | |
| int ntri = n / 3; | |
| float dtheta = 2 * rive::math::PI / ntri; | |
| for (int i = 0; i < ntri; ++i) | |
| { | |
| path_add_star(path, 3, dtheta * i, (i & 1) ? -1 : 1); | |
| } | |
| } | |
| else if (n & 1) | |
| { | |
| path_add_star(path, n, 0, 1); | |
| } | |
| else | |
| { | |
| path_add_star(path, (n / 2) | 1, 0, 1); | |
| path_add_star(path, (n / 2) | 1, rive::math::PI, -1); | |
| } | |
| } | |
| for (uint32_t y = 0; y < 7; ++y) | |
| { | |
| renderer->save(); | |
| for (uint32_t x = 0; x < 7; ++x) | |
| { | |
| renderer->save(); | |
| bool flipMatrix = false; | |
| if (y == 0) | |
| { | |
| stars[x]->fillRule(FillRule::nonZero); | |
| } | |
| else if (y == 1) | |
| { | |
| stars[x]->fillRule(FillRule::evenOdd); | |
| flipMatrix = true; | |
| } | |
| else if (y == 2) | |
| { | |
| stars[x]->fillRule(FillRule::clockwise); | |
| } | |
| else if (y == 3) | |
| { | |
| stars[x]->fillRule(FillRule::clockwise); | |
| flipMatrix = true; | |
| } | |
| else | |
| { | |
| stars[x]->fillRule(static_cast<FillRule>((x + y) / 2 % 3)); | |
| flipMatrix = (x ^ y) & 1; | |
| } | |
| renderer->translate(60, 60); | |
| renderer->scale(50, 50); | |
| if (flipMatrix) | |
| { | |
| if (x & 1) | |
| renderer->scale(-1, 1); | |
| else | |
| renderer->scale(1, -1); | |
| } | |
| renderer->drawPath( | |
| stars[x].get(), | |
| Paint(((y * x + 123458383u) * 285018463u) | 0xff808080)); | |
| renderer->restore(); | |
| renderer->translate(120, 0); | |
| } | |
| renderer->restore(); | |
| renderer->translate(0, 120); | |
| } | |
| } | |
| }; | |
| GMREGISTER(interleavedfillrule, return new InterleavedFillRuleGM) | |
| } // namespace rive::gpu |