#ifndef CSSWrapShapes_h
#define CSSWrapShapes_h
#include "CSSPrimitiveValue.h"
#include "PlatformString.h"
#include "WindRule.h"
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
class CSSWrapShape : public RefCounted<CSSWrapShape> {
public:
enum Type {
CSS_WRAP_SHAPE_RECTANGLE = 1,
CSS_WRAP_SHAPE_CIRCLE = 2,
CSS_WRAP_SHAPE_ELLIPSE = 3,
CSS_WRAP_SHAPE_POLYGON = 4,
CSS_WRAP_SHAPE_PATH = 5
};
virtual Type type() = 0;
virtual String cssText() const = 0;
public:
virtual ~CSSWrapShape() { }
protected:
CSSWrapShape() { }
};
class CSSWrapShapeRectangle : public CSSWrapShape {
public:
static PassRefPtr<CSSWrapShapeRectangle> create() { return adoptRef(new CSSWrapShapeRectangle); }
CSSPrimitiveValue* left() const { return m_left.get(); }
CSSPrimitiveValue* top() const { return m_top.get(); }
CSSPrimitiveValue* width() const { return m_width.get(); }
CSSPrimitiveValue* height() const { return m_height.get(); }
CSSPrimitiveValue* radiusX() const { return m_radiusX.get(); }
CSSPrimitiveValue* radiusY() const { return m_radiusY.get(); }
void setLeft(PassRefPtr<CSSPrimitiveValue> left) { m_left = left; }
void setTop(PassRefPtr<CSSPrimitiveValue> top) { m_top = top; }
void setWidth(PassRefPtr<CSSPrimitiveValue> width) { m_width = width; }
void setHeight(PassRefPtr<CSSPrimitiveValue> height) { m_height = height; }
void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; }
void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; }
virtual Type type() { return CSS_WRAP_SHAPE_RECTANGLE; }
virtual String cssText() const;
private:
CSSWrapShapeRectangle() { }
RefPtr<CSSPrimitiveValue> m_top;
RefPtr<CSSPrimitiveValue> m_left;
RefPtr<CSSPrimitiveValue> m_width;
RefPtr<CSSPrimitiveValue> m_height;
RefPtr<CSSPrimitiveValue> m_radiusX;
RefPtr<CSSPrimitiveValue> m_radiusY;
};
class CSSWrapShapeCircle : public CSSWrapShape {
public:
static PassRefPtr<CSSWrapShapeCircle> create() { return adoptRef(new CSSWrapShapeCircle); }
CSSPrimitiveValue* left() const { return m_left.get(); }
CSSPrimitiveValue* top() const { return m_top.get(); }
CSSPrimitiveValue* radius() const { return m_radius.get(); }
void setLeft(PassRefPtr<CSSPrimitiveValue> left) { m_left = left; }
void setTop(PassRefPtr<CSSPrimitiveValue> top) { m_top = top; }
void setRadius(PassRefPtr<CSSPrimitiveValue> radius) { m_radius = radius; }
virtual Type type() { return CSS_WRAP_SHAPE_CIRCLE; }
virtual String cssText() const;
private:
CSSWrapShapeCircle() { }
RefPtr<CSSPrimitiveValue> m_top;
RefPtr<CSSPrimitiveValue> m_left;
RefPtr<CSSPrimitiveValue> m_radius;
};
class CSSWrapShapeEllipse : public CSSWrapShape {
public:
static PassRefPtr<CSSWrapShapeEllipse> create() { return adoptRef(new CSSWrapShapeEllipse); }
CSSPrimitiveValue* left() const { return m_left.get(); }
CSSPrimitiveValue* top() const { return m_top.get(); }
CSSPrimitiveValue* radiusX() const { return m_radiusX.get(); }
CSSPrimitiveValue* radiusY() const { return m_radiusY.get(); }
void setLeft(PassRefPtr<CSSPrimitiveValue> left) { m_left = left; }
void setTop(PassRefPtr<CSSPrimitiveValue> top) { m_top = top; }
void setRadiusX(PassRefPtr<CSSPrimitiveValue> radiusX) { m_radiusX = radiusX; }
void setRadiusY(PassRefPtr<CSSPrimitiveValue> radiusY) { m_radiusY = radiusY; }
virtual Type type() { return CSS_WRAP_SHAPE_ELLIPSE; }
virtual String cssText() const;
private:
CSSWrapShapeEllipse() { }
RefPtr<CSSPrimitiveValue> m_top;
RefPtr<CSSPrimitiveValue> m_left;
RefPtr<CSSPrimitiveValue> m_radiusX;
RefPtr<CSSPrimitiveValue> m_radiusY;
};
class CSSWrapShapePolygon : public CSSWrapShape {
public:
static PassRefPtr<CSSWrapShapePolygon> create() { return adoptRef(new CSSWrapShapePolygon); }
void appendPoint(PassRefPtr<CSSPrimitiveValue> x, PassRefPtr<CSSPrimitiveValue> y)
{
m_values.append(x);
m_values.append(y);
}
PassRefPtr<CSSPrimitiveValue> getXAt(unsigned i) { return m_values.at(i * 2); }
PassRefPtr<CSSPrimitiveValue> getYAt(unsigned i) { return m_values.at(i * 2 + 1); }
void setWindRule(WindRule w) { m_windRule = w; }
WindRule windRule() const { return m_windRule; }
virtual Type type() { return CSS_WRAP_SHAPE_POLYGON; }
virtual String cssText() const;
private:
CSSWrapShapePolygon()
: m_windRule(RULE_NONZERO)
{
}
Vector<RefPtr<CSSPrimitiveValue> > m_values;
WindRule m_windRule;
};
}
#endif // CSSWrapShapes_h