70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
#ifndef LUNASVG_SVGRENDERSTATE_H
|
|
#define LUNASVG_SVGRENDERSTATE_H
|
|
|
|
#include "svgelement.h"
|
|
|
|
namespace lunasvg {
|
|
|
|
enum class SVGRenderMode {
|
|
Painting,
|
|
Clipping
|
|
};
|
|
|
|
class SVGBlendInfo {
|
|
public:
|
|
explicit SVGBlendInfo(const SVGElement* element);
|
|
SVGBlendInfo(const SVGClipPathElement* clipper, const SVGMaskElement* masker, float opacity)
|
|
: m_clipper(clipper), m_masker(masker), m_opacity(opacity)
|
|
{}
|
|
|
|
bool requiresCompositing(SVGRenderMode mode) const;
|
|
const SVGClipPathElement* clipper() const { return m_clipper; }
|
|
const SVGMaskElement* masker() const { return m_masker; }
|
|
float opacity() const { return m_opacity; }
|
|
|
|
private:
|
|
const SVGClipPathElement* m_clipper;
|
|
const SVGMaskElement* m_masker;
|
|
const float m_opacity;
|
|
};
|
|
|
|
class SVGRenderState {
|
|
public:
|
|
SVGRenderState(const SVGElement* element, const SVGRenderState& parent, const Transform& localTransform)
|
|
: m_element(element), m_parent(&parent), m_currentTransform(parent.currentTransform() * localTransform)
|
|
, m_mode(parent.mode()), m_canvas(parent.canvas())
|
|
{}
|
|
|
|
SVGRenderState(const SVGElement* element, const SVGRenderState* parent, const Transform& currentTransform, SVGRenderMode mode, std::shared_ptr<Canvas> canvas)
|
|
: m_element(element), m_parent(parent), m_currentTransform(currentTransform), m_mode(mode), m_canvas(std::move(canvas))
|
|
{}
|
|
|
|
Canvas& operator*() const { return *m_canvas; }
|
|
Canvas* operator->() const { return &*m_canvas; }
|
|
|
|
const SVGElement* element() const { return m_element; }
|
|
const SVGRenderState* parent() const { return m_parent; }
|
|
const Transform& currentTransform() const { return m_currentTransform; }
|
|
const SVGRenderMode mode() const { return m_mode; }
|
|
const std::shared_ptr<Canvas>& canvas() const { return m_canvas; }
|
|
|
|
Rect fillBoundingBox() const { return m_element->fillBoundingBox(); }
|
|
Rect paintBoundingBox() const { return m_element->paintBoundingBox(); }
|
|
|
|
bool hasCycleReference(const SVGElement* element) const;
|
|
|
|
void beginGroup(const SVGBlendInfo& blendInfo);
|
|
void endGroup(const SVGBlendInfo& blendInfo);
|
|
|
|
private:
|
|
const SVGElement* m_element;
|
|
const SVGRenderState* m_parent;
|
|
const Transform m_currentTransform;
|
|
const SVGRenderMode m_mode;
|
|
std::shared_ptr<Canvas> m_canvas;
|
|
};
|
|
|
|
} // namespace lunasvg
|
|
|
|
#endif // LUNASVG_SVGRENDERSTATE_H
|