#pragma once
#include "BasicShapes.h"
#include "CSSValueKeywords.h"
#include "StyleImage.h"
#include <wtf/PassRefPtr.h>
namespace WebCore {
class ShapeValue : public RefCounted<ShapeValue> {
public:
enum class Type {
Shape,
Box,
Image
};
static Ref<ShapeValue> createShapeValue(PassRefPtr<BasicShape> shape, CSSBoxType cssBox)
{
return adoptRef(*new ShapeValue(shape, cssBox));
}
static Ref<ShapeValue> createBoxShapeValue(CSSBoxType boxShape)
{
return adoptRef(*new ShapeValue(boxShape));
}
static Ref<ShapeValue> createImageValue(PassRefPtr<StyleImage> image)
{
return adoptRef(*new ShapeValue(image));
}
Type type() const { return m_type; }
BasicShape* shape() const { return m_shape.get(); }
CSSBoxType cssBox() const { return m_cssBox; }
StyleImage* image() const { return m_image.get(); }
bool isImageValid() const;
void setImage(PassRefPtr<StyleImage> image)
{
ASSERT(type() == Type::Image);
if (m_image != image)
m_image = image;
}
bool operator==(const ShapeValue&) const;
bool operator!=(const ShapeValue& other) const
{
return !(*this == other);
}
private:
ShapeValue(PassRefPtr<BasicShape> shape, CSSBoxType cssBox)
: m_type(Type::Shape)
, m_shape(shape)
, m_cssBox(cssBox)
{
}
ShapeValue(Type type)
: m_type(type)
{
}
ShapeValue(PassRefPtr<StyleImage> image)
: m_type(Type::Image)
, m_image(image)
{
}
ShapeValue(CSSBoxType cssBox)
: m_type(Type::Box)
, m_cssBox(cssBox)
{
}
Type m_type;
RefPtr<BasicShape> m_shape;
RefPtr<StyleImage> m_image;
CSSBoxType m_cssBox { BoxMissing };
};
}