blob: e74f93565be56d6bd61c154bd0177739dfa2c1a0 [file] [log] [blame]
#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();
}