blob: dfc26dbda35770db4018631b320532a1838a1e8c [file]
#ifndef _RIVE_SHAPE_PAINT_CONTAINER_HPP_
#define _RIVE_SHAPE_PAINT_CONTAINER_HPP_
#include "rive/refcnt.hpp"
#include "rive/shapes/path_flags.hpp"
#include "rive/shapes/shape_paint_path.hpp"
#include "rive/math/mat2d.hpp"
#include <vector>
namespace rive
{
class Artboard;
class ShapePaint;
class Component;
class CommandPath;
class ShapePaintContainer
{
friend class ShapePaint;
protected:
// Need this to access our artboard. We are treated as a mixin, either
// as a Shape or Artboard, so both of those will override this.
virtual Artboard* getArtboard() = 0;
PathFlags m_pathFlags = PathFlags::none;
std::vector<ShapePaint*> m_ShapePaints;
void addPaint(ShapePaint* paint);
public:
static ShapePaintContainer* from(Component* component);
#ifdef WITH_RIVE_EDITOR
// Editor-only removal companion to `addPaint` — fired from
// `ShapePaint::editorParentChanged` when the paint is reparented
// away (or about to be freed) so the container's typed list
// doesn't dangle. Runtime build assumes immutable hierarchy and
// never reaches this. Body in `component_parent_editor.cpp`.
void removePaintForEditor(ShapePaint* paint);
// Editor-only re-sort of `m_ShapePaints` by sibling
// `FractionalIndex`. Runtime build never reorders ShapePaints
// after hydration; editor builds need this hook so the
// inspector's drag-reorder actually changes the rendered draw
// order (the runtime renders by walking `m_ShapePaints` in
// vector order). Mirrors `Path::sortVerticesForEditor`.
void sortShapePaintsForEditor();
// Editor-only read-only view of `m_ShapePaints` for diagnostics
// (dispatcher debug, inspector introspection). The runtime
// build uses `TESTING`-gated `shapePaints()` for the same.
const std::vector<ShapePaint*>& shapePaintsForEditor() const
{
return m_ShapePaints;
}
#endif
/// The component that's responsible for path building, helpful for adding
/// dependencies after the paths are built.
virtual Component* pathBuilder() = 0;
virtual ~ShapePaintContainer() {}
PathFlags pathFlags() const;
void invalidateStrokeEffects();
void propagateOpacity(float opacity);
virtual const Mat2D& shapeWorldTransform() const = 0;
const std::vector<ShapePaint*>& shapePaints() const
{
return m_ShapePaints;
}
virtual ShapePaintPath* worldPath() { return nullptr; }
virtual ShapePaintPath* localPath() { return nullptr; }
virtual ShapePaintPath* localClockwisePath() { return nullptr; }
};
} // namespace rive
#endif