| /* |
| * Copyright 2023 Rive |
| */ |
| |
| #include "gm.hpp" |
| #include "gmutils.hpp" |
| #include "rive/renderer.hpp" |
| |
| using namespace rivegm; |
| using namespace rive; |
| |
| // Make sure gradients don't go NaN-tastic when they have co-located |
| // (degenerate) stops, and that they render as specified when stops are |
| // co-located. |
| class DegenGradGM : public GM |
| { |
| public: |
| DegenGradGM() : GM(200 * 4 + 50, 200 * 3 + 50) {} |
| |
| void onDraw(rive::Renderer* renderer) override |
| { |
| Factory* factory = TestingWindow::Get()->factory(); |
| |
| auto rect = factory->makeEmptyRenderPath(); |
| rect->addRect(0, 0, 150.f, 150.f); |
| |
| auto paint = factory->makeRenderPaint(); |
| |
| renderer->translate(50, 50); |
| |
| ColorInt colors2[] = {0xff0000ff, 0xff00ff00}; |
| // Stuff a red stop in the middle and ensure no red shows up in the |
| // drawing. |
| ColorInt colors3[] = {0xff0000ff, 0xffff0000, 0xff00ff00}; |
| |
| for (float stop : {.0f, .5f, 1.f}) |
| { |
| float stops[] = {stop, stop, stop}; |
| |
| renderer->save(); |
| |
| paint->shader( |
| factory->makeLinearGradient(0, 0, 150, 150, colors2, stops, 2)); |
| renderer->drawPath(rect.get(), paint.get()); |
| |
| renderer->translate(200, 0); |
| paint->shader( |
| factory->makeRadialGradient(75, 75, 75, colors2, stops, 2)); |
| renderer->drawPath(rect.get(), paint.get()); |
| |
| renderer->translate(200, 0); |
| paint->shader( |
| factory->makeLinearGradient(0, 0, 150, 150, colors3, stops, 3)); |
| renderer->drawPath(rect.get(), paint.get()); |
| |
| renderer->translate(200, 0); |
| paint->shader( |
| factory->makeRadialGradient(75, 75, 75, colors3, stops, 3)); |
| renderer->drawPath(rect.get(), paint.get()); |
| |
| renderer->restore(); |
| renderer->translate(0, 200); |
| } |
| } |
| }; |
| |
| GMREGISTER(degengrad, return new DegenGradGM()) |