blob: c5b44b63020b6ca9edb4f9d7cc999097b6836fe7 [file] [log] [blame]
/*
* Copyright 2025 Rive
*/
#include "gm.hpp"
#include "gmutils.hpp"
#include "rive/renderer.hpp"
using namespace rivegm;
using namespace rive;
// Check that clockwise paths render & blend correctly with winding numbers much
// larger than 1.
// It's especially important to check that clockwise render modes with
// transparency don't corrupt the paint after coverage is fully saturated.
static void draw_overfill_paths(ColorInt color0,
BlendMode mode0,
ColorInt color1,
BlendMode mode1,
ColorInt color2,
BlendMode mode2,
Renderer* renderer)
{
PathBuilder pathBuilder;
pathBuilder.fillRule(FillRule::clockwise);
for (float r : {10, 50, 40, 80, 90, 70, 60, 20, 50, 30})
{
pathBuilder.addCircle(100, 100, r);
}
auto path = pathBuilder.detach();
Paint paint;
paint->color(color0);
paint->blendMode(mode0);
renderer->translate(-30, -30);
renderer->drawPath(path.get(), paint.get());
paint->color(color1);
paint->blendMode(mode1);
renderer->translate(60, 0);
renderer->drawPath(path.get(), paint.get());
paint->color(color2);
paint->blendMode(mode2);
renderer->translate(0, 60);
renderer->drawPath(path.get(), paint.get());
}
DEF_SIMPLE_GM(overfill_opaque, 200, 200, renderer)
{
draw_overfill_paths(0xff00ff00,
BlendMode::srcOver,
0xff0000ff,
BlendMode::srcOver,
0xffff0000,
BlendMode::srcOver,
renderer);
}
DEF_SIMPLE_GM(overfill_transparent, 200, 200, renderer)
{
draw_overfill_paths(0x6000ff00,
BlendMode::srcOver,
0x600000ff,
BlendMode::srcOver,
0x60ff0000,
BlendMode::srcOver,
renderer);
}
DEF_SIMPLE_GM_WITH_CLEAR_COLOR(overfill_blendmodes,
0x20202020,
200,
200,
renderer)
{
draw_overfill_paths(0xc040f010,
BlendMode::colorDodge,
0xc01040f0,
BlendMode::hardLight,
0xc0f01040,
BlendMode::luminosity,
renderer);
}