blob: 475612f28a2384236298292fb38fa1132ecc1c67 [file] [log] [blame] [edit]
/*
* 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())