mirror of
https://github.com/RetroDECK/ES-DE.git
synced 2024-11-25 07:35:38 +00:00
336 lines
9 KiB
C++
336 lines
9 KiB
C++
#ifndef PAINTELEMENT_H
|
|
#define PAINTELEMENT_H
|
|
|
|
#include "styledelement.h"
|
|
#include "canvas.h"
|
|
|
|
namespace lunasvg {
|
|
|
|
class LayoutObject;
|
|
|
|
class PaintElement : public StyledElement {
|
|
public:
|
|
PaintElement(ElementID id);
|
|
|
|
bool isPaint() const { return true; }
|
|
virtual std::unique_ptr<LayoutObject> getPainter(LayoutContext* context) const = 0;
|
|
};
|
|
|
|
class GradientElement : public PaintElement {
|
|
public:
|
|
GradientElement(ElementID id);
|
|
|
|
Transform gradientTransform() const;
|
|
SpreadMethod spreadMethod() const;
|
|
Units gradientUnits() const;
|
|
std::string href() const;
|
|
GradientStops buildGradientStops() const;
|
|
};
|
|
|
|
class LinearGradientElement : public GradientElement {
|
|
public:
|
|
LinearGradientElement();
|
|
|
|
Length x1() const;
|
|
Length y1() const;
|
|
Length x2() const;
|
|
Length y2() const;
|
|
|
|
std::unique_ptr<LayoutObject> getPainter(LayoutContext* context) const;
|
|
std::unique_ptr<Node> clone() const;
|
|
};
|
|
|
|
class RadialGradientElement : public GradientElement {
|
|
public:
|
|
RadialGradientElement();
|
|
|
|
Length cx() const;
|
|
Length cy() const;
|
|
Length r() const;
|
|
Length fx() const;
|
|
Length fy() const;
|
|
|
|
std::unique_ptr<LayoutObject> getPainter(LayoutContext* context) const;
|
|
std::unique_ptr<Node> clone() const;
|
|
};
|
|
|
|
class PatternElement : public PaintElement {
|
|
public:
|
|
PatternElement();
|
|
|
|
Length x() const;
|
|
Length y() const;
|
|
Length width() const;
|
|
Length height() const;
|
|
Transform patternTransform() const;
|
|
Units patternUnits() const;
|
|
Units patternContentUnits() const;
|
|
|
|
Rect viewBox() const;
|
|
PreserveAspectRatio preserveAspectRatio() const;
|
|
std::string href() const;
|
|
|
|
std::unique_ptr<LayoutObject> getPainter(LayoutContext* context) const;
|
|
std::unique_ptr<Node> clone() const;
|
|
};
|
|
|
|
class SolidColorElement : public PaintElement {
|
|
public:
|
|
SolidColorElement();
|
|
|
|
std::unique_ptr<LayoutObject> getPainter(LayoutContext*) const;
|
|
std::unique_ptr<Node> clone() const;
|
|
};
|
|
|
|
class GradientAttributes {
|
|
public:
|
|
GradientAttributes() = default;
|
|
|
|
const Transform& gradientTransform() const { return m_gradientTransform; }
|
|
SpreadMethod spreadMethod() const { return m_spreadMethod; }
|
|
Units gradientUnits() const { return m_gradientUnits; }
|
|
const GradientStops& gradientStops() const { return m_gradientStops; }
|
|
|
|
bool hasGradientTransform() const { return m_hasGradientTransform; }
|
|
bool hasSpreadMethod() const { return m_hasSpreadMethod; }
|
|
bool hasGradientUnits() const { return m_hasGradientUnits; }
|
|
bool hasGradientStops() const { return m_hasGradientStops; }
|
|
|
|
void setGradientTransform(const Transform& gradientTransform) {
|
|
m_gradientTransform = gradientTransform;
|
|
m_hasGradientTransform = true;
|
|
}
|
|
|
|
void setSpreadMethod(SpreadMethod spreadMethod) {
|
|
m_spreadMethod = spreadMethod;
|
|
m_hasSpreadMethod = true;
|
|
}
|
|
|
|
void setGradientUnits(Units gradientUnits) {
|
|
m_gradientUnits = gradientUnits;
|
|
m_hasGradientUnits = true;
|
|
}
|
|
|
|
void setGradientStops(const GradientStops& gradientStops) {
|
|
m_gradientStops = gradientStops;
|
|
m_hasGradientStops = gradientStops.size();
|
|
}
|
|
|
|
private:
|
|
Transform m_gradientTransform;
|
|
SpreadMethod m_spreadMethod{SpreadMethod::Pad};
|
|
Units m_gradientUnits{Units::ObjectBoundingBox};
|
|
GradientStops m_gradientStops;
|
|
|
|
bool m_hasGradientTransform{false};
|
|
bool m_hasSpreadMethod{false};
|
|
bool m_hasGradientUnits{false};
|
|
bool m_hasGradientStops{false};
|
|
};
|
|
|
|
class LinearGradientAttributes : public GradientAttributes {
|
|
public:
|
|
LinearGradientAttributes() = default;
|
|
|
|
const Length& x1() const { return m_x1; }
|
|
const Length& y1() const { return m_y1; }
|
|
const Length& x2() const { return m_x2; }
|
|
const Length& y2() const { return m_y2; }
|
|
|
|
bool hasX1() const { return m_hasX1; }
|
|
bool hasY1() const { return m_hasY1; }
|
|
bool hasX2() const { return m_hasX2; }
|
|
bool hasY2() const { return m_hasY2; }
|
|
|
|
void setX1(const Length& x1) {
|
|
m_x1 = x1;
|
|
m_hasX1 = true;
|
|
}
|
|
|
|
void setY1(const Length& y1) {
|
|
m_y1 = y1;
|
|
m_hasY1 = true;
|
|
}
|
|
|
|
void setX2(const Length& x2) {
|
|
m_x2 = x2;
|
|
m_hasX2 = true;
|
|
}
|
|
|
|
void setY2(const Length& y2) {
|
|
m_y2 = y2;
|
|
m_hasY2 = true;
|
|
}
|
|
|
|
private:
|
|
Length m_x1;
|
|
Length m_y1;
|
|
Length m_x2{100, LengthUnits::Percent};
|
|
Length m_y2;
|
|
|
|
bool m_hasX1{false};
|
|
bool m_hasY1{false};
|
|
bool m_hasX2{false};
|
|
bool m_hasY2{false};
|
|
};
|
|
|
|
class RadialGradientAttributes : public GradientAttributes {
|
|
public:
|
|
RadialGradientAttributes() = default;
|
|
|
|
const Length& cx() const { return m_cx; }
|
|
const Length& cy() const { return m_cy; }
|
|
const Length& r() const { return m_r; }
|
|
const Length& fx() const { return m_fx; }
|
|
const Length& fy() const { return m_fy; }
|
|
|
|
bool hasCx() const { return m_hasCx; }
|
|
bool hasCy() const { return m_hasCy; }
|
|
bool hasR() const { return m_hasR; }
|
|
bool hasFx() const { return m_hasFx; }
|
|
bool hasFy() const { return m_hasFy; }
|
|
|
|
void setCx(const Length& cx) {
|
|
m_cx = cx;
|
|
m_hasCx = true;
|
|
}
|
|
|
|
void setCy(const Length& cy) {
|
|
m_cy = cy;
|
|
m_hasCy = true;
|
|
}
|
|
|
|
void setR(const Length& r) {
|
|
m_r = r;
|
|
m_hasR = true;
|
|
}
|
|
|
|
void setFx(const Length& fx) {
|
|
m_fx = fx;
|
|
m_hasFx = true;
|
|
}
|
|
|
|
void setFy(const Length& fy) {
|
|
m_fy = fy;
|
|
m_hasFy = true;
|
|
}
|
|
|
|
|
|
private:
|
|
Length m_cx{50, LengthUnits::Percent};
|
|
Length m_cy{50, LengthUnits::Percent};
|
|
Length m_r{50, LengthUnits::Percent};
|
|
Length m_fx;
|
|
Length m_fy;
|
|
|
|
bool m_hasCx{false};
|
|
bool m_hasCy{false};
|
|
bool m_hasR{false};
|
|
bool m_hasFx{false};
|
|
bool m_hasFy{false};
|
|
};
|
|
|
|
class PatternAttributes {
|
|
public:
|
|
PatternAttributes() = default;
|
|
|
|
const Length& x() const { return m_x; }
|
|
const Length& y() const { return m_y; }
|
|
const Length& width() const { return m_width; }
|
|
const Length& height() const { return m_height; }
|
|
const Transform& patternTransform() const { return m_patternTransform; }
|
|
Units patternUnits() const { return m_patternUnits; }
|
|
Units patternContentUnits() const { return m_patternContentUnits; }
|
|
const Rect& viewBox() const { return m_viewBox; }
|
|
const PreserveAspectRatio& preserveAspectRatio() const { return m_preserveAspectRatio; }
|
|
const PatternElement* patternContentElement() const { return m_patternContentElement; }
|
|
|
|
bool hasX() const { return m_hasX; }
|
|
bool hasY() const { return m_hasY; }
|
|
bool hasWidth() const { return m_hasWidth; }
|
|
bool hasHeight() const { return m_hasHeight; }
|
|
bool hasPatternTransform() const { return m_hasPatternTransform; }
|
|
bool hasPatternUnits() const { return m_hasPatternUnits; }
|
|
bool hasPatternContentUnits() const { return m_hasPatternContentUnits; }
|
|
bool hasViewBox() const { return m_hasViewBox; }
|
|
bool hasPreserveAspectRatio() const { return m_hasPreserveAspectRatio; }
|
|
bool hasPatternContentElement() const { return m_hasPatternContentElement; }
|
|
|
|
void setX(const Length& x) {
|
|
m_x = x;
|
|
m_hasX = true;
|
|
}
|
|
|
|
void setY(const Length& y) {
|
|
m_y = y;
|
|
m_hasY = true;
|
|
}
|
|
|
|
void setWidth(const Length& width) {
|
|
m_width = width;
|
|
m_hasWidth = true;
|
|
}
|
|
|
|
void setHeight(const Length& height) {
|
|
m_height = height;
|
|
m_hasHeight = true;
|
|
}
|
|
|
|
void setPatternTransform(const Transform& patternTransform) {
|
|
m_patternTransform = patternTransform;
|
|
m_hasPatternTransform = true;
|
|
}
|
|
|
|
void setPatternUnits(Units patternUnits) {
|
|
m_patternUnits = patternUnits;
|
|
m_hasPatternUnits = true;
|
|
}
|
|
|
|
void setPatternContentUnits(Units patternContentUnits) {
|
|
m_patternContentUnits = patternContentUnits;
|
|
m_hasPatternContentUnits = true;
|
|
}
|
|
|
|
void setViewBox(const Rect& viewBox) {
|
|
m_viewBox = viewBox;
|
|
m_hasViewBox = true;
|
|
}
|
|
|
|
void setPreserveAspectRatio(const PreserveAspectRatio& preserveAspectRatio) {
|
|
m_preserveAspectRatio = preserveAspectRatio;
|
|
m_hasPreserveAspectRatio = true;
|
|
}
|
|
|
|
void setPatternContentElement(const PatternElement* patternContentElement) {
|
|
m_patternContentElement = patternContentElement;
|
|
m_hasPatternContentElement = true;
|
|
}
|
|
|
|
private:
|
|
Length m_x;
|
|
Length m_y;
|
|
Length m_width;
|
|
Length m_height;
|
|
Transform m_patternTransform;
|
|
Units m_patternUnits{Units::ObjectBoundingBox};
|
|
Units m_patternContentUnits{Units::UserSpaceOnUse};
|
|
Rect m_viewBox{Rect::Invalid};
|
|
PreserveAspectRatio m_preserveAspectRatio;
|
|
const PatternElement* m_patternContentElement{nullptr};
|
|
|
|
bool m_hasX{false};
|
|
bool m_hasY{false};
|
|
bool m_hasWidth{false};
|
|
bool m_hasHeight{false};
|
|
bool m_hasPatternTransform{false};
|
|
bool m_hasPatternUnits{false};
|
|
bool m_hasPatternContentUnits{false};
|
|
bool m_hasViewBox{false};
|
|
bool m_hasPreserveAspectRatio{false};
|
|
bool m_hasPatternContentElement{false};
|
|
};
|
|
|
|
} // namespace lunasvg
|
|
|
|
#endif // PAINTELEMENT_H
|