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