#ifndef PolygonShape_h
#define PolygonShape_h
#include "core/rendering/shapes/Shape.h"
#include "platform/geometry/FloatPolygon.h"
namespace WebCore {
class OffsetPolygonEdge FINAL : public VertexPair {
public:
enum Basis {
Edge,
Vertex,
LineTop
};
OffsetPolygonEdge(const FloatPolygonEdge& edge, const FloatSize& offset)
: m_vertex1(edge.vertex1() + offset)
, m_vertex2(edge.vertex2() + offset)
, m_edgeIndex(edge.edgeIndex())
, m_basis(Edge)
{
}
OffsetPolygonEdge(const FloatPoint& reflexVertex, const FloatSize& offset1, const FloatSize& offset2)
: m_vertex1(reflexVertex + offset1)
, m_vertex2(reflexVertex + offset2)
, m_edgeIndex(-1)
, m_basis(Vertex)
{
}
OffsetPolygonEdge(const FloatPolygon& polygon, float minLogicalIntervalTop, const FloatSize& offset)
: m_vertex1(FloatPoint(polygon.boundingBox().x(), minLogicalIntervalTop) + offset)
, m_vertex2(FloatPoint(polygon.boundingBox().maxX(), minLogicalIntervalTop) + offset)
, m_edgeIndex(-1)
, m_basis(LineTop)
{
}
virtual const FloatPoint& vertex1() const OVERRIDE { return m_vertex1; }
virtual const FloatPoint& vertex2() const OVERRIDE { return m_vertex2; }
int edgeIndex() const { return m_edgeIndex; }
Basis basis() const { return m_basis; }
private:
FloatPoint m_vertex1;
FloatPoint m_vertex2;
int m_edgeIndex;
Basis m_basis;
};
class PolygonShape FINAL : public Shape {
WTF_MAKE_NONCOPYABLE(PolygonShape);
public:
PolygonShape(PassOwnPtr<Vector<FloatPoint> > vertices, WindRule fillRule)
: Shape()
, m_polygon(vertices, fillRule)
, m_marginBounds(nullptr)
{
}
virtual LayoutRect shapeMarginLogicalBoundingBox() const OVERRIDE { return static_cast<LayoutRect>(shapeMarginBounds().boundingBox()); }
virtual bool isEmpty() const OVERRIDE { return m_polygon.isEmpty(); }
virtual void getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
private:
const FloatPolygon& shapeMarginBounds() const;
FloatPolygon m_polygon;
mutable OwnPtr<FloatPolygon> m_marginBounds;
};
}
#endif