| #include "rive/shapes/shape_paint_path.hpp" |
| #include "rive/component.hpp" |
| #include "rive/artboard.hpp" |
| #include "rive/factory.hpp" |
| |
| using namespace rive; |
| |
| ShapePaintPath::ShapePaintPath(bool isLocal) : m_isLocal(isLocal) {} |
| ShapePaintPath::ShapePaintPath(bool isLocal, FillRule fillRule) : |
| m_isLocal(isLocal), m_fillRule(fillRule) |
| {} |
| |
| void ShapePaintPath::rewind() |
| { |
| m_rawPath.rewind(); |
| m_isRenderPathDirty = true; |
| } |
| |
| void ShapePaintPath::addPath(const RawPath& rawPath, const Mat2D* transform) |
| { |
| auto iter = m_rawPath.addPath(rawPath, transform); |
| m_rawPath.pruneEmptySegments(iter); |
| m_isRenderPathDirty = true; |
| } |
| |
| void ShapePaintPath::addPathClockwise(const RawPath& rawPath, |
| const Mat2D* transform) |
| { |
| float coarseArea = rawPath.computeCoarseArea(); |
| if (transform != nullptr) |
| { |
| coarseArea *= transform->determinant(); |
| } |
| if (coarseArea < 0) |
| { |
| addPathBackwards(rawPath, transform); |
| } |
| else |
| { |
| addPath(rawPath, transform); |
| } |
| } |
| |
| void ShapePaintPath::addPathBackwards(const RawPath& rawPath, |
| const Mat2D* transform) |
| { |
| auto iter = m_rawPath.addPathBackwards(rawPath, transform); |
| m_rawPath.pruneEmptySegments(iter); |
| m_isRenderPathDirty = true; |
| } |
| |
| RenderPath* ShapePaintPath::renderPath(const Component* component) |
| { |
| assert(component != nullptr); |
| return renderPath(component->artboard()->factory()); |
| } |
| |
| RenderPath* ShapePaintPath::renderPath(Factory* factory) |
| { |
| assert(factory != nullptr); |
| if (!m_renderPath) |
| { |
| m_renderPath = factory->makeEmptyRenderPath(); |
| m_renderPath->addRawPath(m_rawPath); |
| m_renderPath->fillRule(m_fillRule); |
| m_isRenderPathDirty = false; |
| } |
| else if (m_isRenderPathDirty) |
| { |
| m_renderPath->rewind(); |
| m_renderPath->addRawPath(m_rawPath); |
| m_isRenderPathDirty = false; |
| } |
| |
| return m_renderPath.get(); |
| } |