| /* | |
| * Copyright 2025 Rive | |
| */ | |
| #include "common/render_context_null.hpp" | |
| #include "rive/renderer/rive_renderer.hpp" | |
| #include <catch.hpp> | |
| namespace rive::gpu | |
| { | |
| // Ensures that a zero-area double cusp does not trigger assertions in the | |
| // feathering code. | |
| TEST_CASE("feathercusp", "[feather]") | |
| { | |
| std::unique_ptr<RenderContext> renderContext = | |
| RenderContextNULL::MakeContext(); | |
| renderContext->beginFrame({ | |
| .renderTargetWidth = 1000, | |
| .renderTargetHeight = 1000, | |
| }); | |
| auto path = renderContext->makeEmptyRenderPath(); | |
| path->fillRule(FillRule::clockwise); | |
| path->moveTo(95.164070f, 799.999939f); | |
| path->cubicTo(-125.766922f, | |
| 799.999939f, | |
| 274.233032f, | |
| 799.999939f, | |
| -95.164070f, | |
| 799.999939f); | |
| auto paint = renderContext->makeRenderPaint(); | |
| paint->color(0xffffffff); | |
| paint->feather(32); | |
| RiveRenderer renderer(renderContext.get()); | |
| renderer.drawPath(path.get(), paint.get()); | |
| auto renderTarget = | |
| renderContext->static_impl_cast<RenderContextNULL>()->makeRenderTarget( | |
| renderContext->frameDescriptor().renderTargetWidth, | |
| renderContext->frameDescriptor().renderTargetHeight); | |
| renderContext->flush({.renderTarget = renderTarget.get()}); | |
| // The test passes if nothing crashes. | |
| } | |
| } // namespace rive::gpu |