blob: dc6827914f4c5a7524d041bb80e77c73bf140559 [file] [log] [blame]
/*
* Copyright 2024 Rive
*/
#include "rive/math/math_types.hpp"
#include "../src/rive_render_path.hpp"
#include <catch.hpp>
namespace rive::gpu
{
class PLSTestPath : public RiveRenderPath
{
public:
void addRect(float x,
float y,
float width,
float height,
PathDirection wind)
{
RawPath rawPath;
rawPath.addRect({x, y, x + width, y + height}, wind);
RiveRenderPath path2(FillRule::nonZero, rawPath);
addRenderPath(&path2, Mat2D());
}
void addCircle(float x, float y, float radius, PathDirection wind)
{
RawPath rawPath;
rawPath.addOval({x - radius, y - radius, x + radius, y + radius}, wind);
RiveRenderPath path2(FillRule::nonZero, rawPath);
addRenderPath(&path2, Mat2D());
}
};
// Check that RiveRenderPath::getCoarseArea() is positive for clockwise paths
// and negative for counterclockwise. Also check that it's within a margin of
// error of the true area for curves.
TEST_CASE("getCoarseArea", "[RiveRenderPath]")
{
PLSTestPath path;
CHECK(path.getCoarseArea() == 0);
path.addRect(10, 20, 10, 200, PathDirection::clockwise); // 2000 px
CHECK(path.getCoarseArea() == 2000);
path.addRect(15, 30, 2, 20, PathDirection::counterclockwise); // -40 px
CHECK(path.getCoarseArea() == (2000 - 40));
path.addRect(0, 0, 1, 1, PathDirection::clockwise); // +1 px
CHECK(path.getCoarseArea() == (2000 - 40 + 1));
path.addRect(-1,
-1,
300,
100,
PathDirection::counterclockwise); // -30000 px
CHECK(path.getCoarseArea() == (2000 - 40 + 1 - 30000));
CHECK(path.getCoarseArea() == (2000 - 40 + 1 - 30000));
path.rewind();
CHECK(path.getCoarseArea() == 0);
CHECK(path.getCoarseArea() == 0);
path.addCircle(0, 0, 1000, PathDirection::clockwise);
CHECK(path.getCoarseArea() / (math::PI * 1000 * 1000) ==
Approx(1).margin(1e-2f));
path.rewind();
path.addCircle(30, -100, 900, PathDirection::counterclockwise);
CHECK(path.getCoarseArea() / (math::PI * 900 * 900) ==
Approx(-1).margin(1e-2f));
path.addCircle(0, 0, 1000, PathDirection::clockwise);
CHECK(path.getCoarseArea() /
(math::PI * 1000 * 1000 - math::PI * 900 * 900) ==
Approx(1).margin(1e-2f));
}
} // namespace rive::gpu