#ifndef ClipPathOperation_h
#define ClipPathOperation_h
#include "core/rendering/style/BasicShapes.h"
#include "platform/graphics/Path.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/RefCounted.h"
#include "wtf/text/WTFString.h"
namespace WebCore {
class ClipPathOperation : public RefCounted<ClipPathOperation> {
public:
enum OperationType {
REFERENCE,
SHAPE
};
virtual ~ClipPathOperation() { }
virtual bool operator==(const ClipPathOperation&) const = 0;
bool operator!=(const ClipPathOperation& o) const { return !(*this == o); }
OperationType type() const { return m_type; }
bool isSameType(const ClipPathOperation& o) const { return o.type() == m_type; }
protected:
ClipPathOperation(OperationType type)
: m_type(type)
{
}
OperationType m_type;
};
class ReferenceClipPathOperation FINAL : public ClipPathOperation {
public:
static PassRefPtr<ReferenceClipPathOperation> create(const String& url, const AtomicString& fragment)
{
return adoptRef(new ReferenceClipPathOperation(url, fragment));
}
const String& url() const { return m_url; }
const AtomicString& fragment() const { return m_fragment; }
private:
virtual bool operator==(const ClipPathOperation& o) const OVERRIDE
{
return isSameType(o) && m_url == static_cast<const ReferenceClipPathOperation&>(o).m_url;
}
ReferenceClipPathOperation(const String& url, const AtomicString& fragment)
: ClipPathOperation(REFERENCE)
, m_url(url)
, m_fragment(fragment)
{
}
String m_url;
AtomicString m_fragment;
};
DEFINE_TYPE_CASTS(ReferenceClipPathOperation, ClipPathOperation, op, op->type() == ClipPathOperation::REFERENCE, op.type() == ClipPathOperation::REFERENCE);
class ShapeClipPathOperation FINAL : public ClipPathOperation {
public:
static PassRefPtr<ShapeClipPathOperation> create(PassRefPtr<BasicShape> shape)
{
return adoptRef(new ShapeClipPathOperation(shape));
}
const BasicShape* basicShape() const { return m_shape.get(); }
WindRule windRule() const { return m_shape->windRule(); }
const Path& path(const FloatRect& boundingRect)
{
ASSERT(m_shape);
m_path.clear();
m_path = adoptPtr(new Path);
m_shape->path(*m_path, boundingRect);
return *m_path;
}
private:
virtual bool operator==(const ClipPathOperation&) const OVERRIDE;
ShapeClipPathOperation(PassRefPtr<BasicShape> shape)
: ClipPathOperation(SHAPE)
, m_shape(shape)
{
}
RefPtr<BasicShape> m_shape;
OwnPtr<Path> m_path;
};
DEFINE_TYPE_CASTS(ShapeClipPathOperation, ClipPathOperation, op, op->type() == ClipPathOperation::SHAPE, op.type() == ClipPathOperation::SHAPE);
inline bool ShapeClipPathOperation::operator==(const ClipPathOperation& o) const
{
return isSameType(o) && *m_shape == *toShapeClipPathOperation(o).m_shape;
}
}
#endif