blob: bcf6c26de38b3eb64e0dd0543b865feca12ec069 [file] [log] [blame]
#ifndef _RIVE_SHAPE_PAINT_PATH_HPP_
#define _RIVE_SHAPE_PAINT_PATH_HPP_
#include "rive/math/raw_path.hpp"
#include "rive/renderer.hpp"
namespace rive
{
class Component;
class Factory;
class ShapePaintPath
{
public:
ShapePaintPath(bool isLocal = true);
ShapePaintPath(bool isLocal, FillRule fillRule);
RenderPath* renderPath(const Component* component);
RenderPath* renderPath(Factory* factory);
const RawPath* rawPath() const { return &m_rawPath; }
RawPath* mutableRawPath() { return &m_rawPath; }
bool isLocal() const { return m_isLocal; }
FillRule fillRule() const { return m_fillRule; }
bool empty() const { return m_rawPath.empty(); }
void rewind();
void rewind(bool isLocal, FillRule fillRule)
{
m_isLocal = isLocal;
m_fillRule = fillRule;
rewind();
}
void rewind(bool isLocal)
{
m_isLocal = isLocal;
rewind();
}
void addPath(const RawPath& rawPath, const Mat2D* transform = nullptr);
void addPathBackwards(const RawPath& rawPath,
const Mat2D* transform = nullptr);
// Determines winding of the rawPath and adds in the clockwise order.
void addPathClockwise(const RawPath& rawPath,
const Mat2D* transform = nullptr);
void addPath(const ShapePaintPath* path, const Mat2D* transform = nullptr)
{
return addPath(*path->rawPath(), transform);
}
void addPathBackwards(const ShapePaintPath* path,
const Mat2D* transform = nullptr)
{
return addPathBackwards(*path->rawPath(), transform);
}
void addRect(const AABB& aabb, PathDirection dir = PathDirection::cw)
{
m_rawPath.addRect(aabb, dir);
}
const bool hasRenderPath() const
{
return m_renderPath != nullptr && !m_isRenderPathDirty;
}
#ifdef TESTING
size_t numContours()
{
size_t contours = 0;
for (auto verb : m_rawPath.verbs())
{
if (verb == PathVerb::move)
{
contours++;
}
}
return contours;
}
#endif
private:
bool m_isRenderPathDirty = true;
rcp<RenderPath> m_renderPath;
RawPath m_rawPath;
bool m_isLocal;
FillRule m_fillRule = FillRule::clockwise;
};
} // namespace rive
#endif