78c3ba4665b54ce8976cddbd6500b8bf51de24fc
[WebKit-https.git] / Source / WebCore / rendering / shapes / ShapeInfo.h
1 /*
2 * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above
9 *    copyright notice, this list of conditions and the following
10 *    disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 *    copyright notice, this list of conditions and the following
13 *    disclaimer in the documentation and/or other materials
14 *    provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30 #ifndef ShapeInfo_h
31 #define ShapeInfo_h
32
33 #if ENABLE(CSS_SHAPES)
34
35 #include "FloatRect.h"
36 #include "LayoutUnit.h"
37 #include "RenderStyle.h"
38 #include "Shape.h"
39 #include "ShapeValue.h"
40 #include <wtf/OwnPtr.h>
41 #include <wtf/Vector.h>
42
43 namespace WebCore {
44
45 template<class KeyType, class InfoType>
46 class MappedInfo {
47 public:
48     static InfoType& ensureInfo(const KeyType& key)
49     {
50         InfoMap& infoMap = MappedInfo<KeyType, InfoType>::infoMap();
51         if (InfoType* info = infoMap.get(&key))
52             return *info;
53         typename InfoMap::AddResult result = infoMap.add(&key, std::make_unique<InfoType>(key));
54         return *result.iterator->value;
55     }
56     static void removeInfo(const KeyType& key) { infoMap().remove(&key); }
57     static InfoType* info(const KeyType& key) { return infoMap().get(&key); }
58
59 private:
60     typedef HashMap<const KeyType*, std::unique_ptr<InfoType>> InfoMap;
61     static InfoMap& infoMap()
62     {
63         DEPRECATED_DEFINE_STATIC_LOCAL(InfoMap, staticInfoMap, ());
64         return staticInfoMap;
65     }
66 };
67
68 template<class RenderType>
69 class ShapeInfo {
70     WTF_MAKE_FAST_ALLOCATED;
71 public:
72     virtual ~ShapeInfo() { }
73
74     void setReferenceBoxLogicalSize(LayoutSize);
75
76     SegmentList computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) const;
77
78     LayoutUnit shapeLogicalTop() const { return computedShapeLogicalBoundingBox().y() + logicalTopOffset(); }
79     LayoutUnit shapeLogicalBottom() const { return computedShapeLogicalBoundingBox().maxY() + logicalTopOffset(); }
80     LayoutUnit shapeLogicalLeft() const { return computedShapeLogicalBoundingBox().x() + logicalLeftOffset(); }
81     LayoutUnit shapeLogicalRight() const { return computedShapeLogicalBoundingBox().maxX() + logicalLeftOffset(); }
82     LayoutUnit shapeLogicalWidth() const { return computedShapeLogicalBoundingBox().width(); }
83     LayoutUnit shapeLogicalHeight() const { return computedShapeLogicalBoundingBox().height(); }
84
85     LayoutUnit logicalLineTop() const { return m_referenceBoxLineTop + logicalTopOffset(); }
86     LayoutUnit logicalLineBottom() const { return m_referenceBoxLineTop + m_lineHeight + logicalTopOffset(); }
87     LayoutUnit logicalLineBottom(LayoutUnit lineHeight) const { return m_referenceBoxLineTop + lineHeight + logicalTopOffset(); }
88
89     LayoutUnit shapeContainingBlockLogicalHeight() const { return (m_renderer.style().boxSizing() == CONTENT_BOX) ? (m_referenceBoxLogicalSize.height() + m_renderer.borderAndPaddingLogicalHeight()) : m_referenceBoxLogicalSize.height(); }
90
91     virtual bool lineOverlapsShapeBounds() const = 0;
92
93     void markShapeAsDirty() { m_shape.clear(); }
94     bool isShapeDirty() { return !m_shape.get(); }
95     const RenderType& owner() const { return m_renderer; }
96     LayoutSize referenceBoxLogicalSize() const { return m_referenceBoxLogicalSize; }
97
98     LayoutRect computedShapePhysicalBoundingBox() const
99     {
100         LayoutRect physicalBoundingBox = computedShapeLogicalBoundingBox();
101         physicalBoundingBox.setX(physicalBoundingBox.x() + logicalLeftOffset());
102         physicalBoundingBox.setY(physicalBoundingBox.y() + logicalTopOffset());
103         if (m_renderer.style().isFlippedBlocksWritingMode())
104             physicalBoundingBox.setY(m_renderer.logicalHeight() - physicalBoundingBox.maxY());
105         if (!m_renderer.style().isHorizontalWritingMode())
106             physicalBoundingBox = physicalBoundingBox.transposedRect();
107         return physicalBoundingBox;
108     }
109
110     FloatPoint shapeToRendererPoint(FloatPoint point) const
111     {
112         FloatPoint result = FloatPoint(point.x() + logicalLeftOffset(), point.y() + logicalTopOffset());
113         if (m_renderer.style().isFlippedBlocksWritingMode())
114             result.setY(m_renderer.logicalHeight() - result.y());
115         if (!m_renderer.style().isHorizontalWritingMode())
116             result = result.transposedPoint();
117         return result;
118     }
119
120     FloatSize shapeToRendererSize(FloatSize size) const
121     {
122         if (!m_renderer.style().isHorizontalWritingMode())
123             return size.transposedSize();
124         return size;
125     }
126
127     const Shape& computedShape() const;
128
129 protected:
130     explicit ShapeInfo(const RenderType& renderer)
131         : m_renderer(renderer)
132     {
133     }
134
135     virtual CSSBoxType referenceBox() const = 0;
136     virtual LayoutRect computedShapeLogicalBoundingBox() const = 0;
137     virtual ShapeValue* shapeValue() const = 0;
138     virtual void getIntervals(LayoutUnit, LayoutUnit, SegmentList&) const = 0;
139
140     virtual const RenderStyle& styleForWritingMode() const = 0;
141
142     LayoutUnit logicalTopOffset() const;
143     LayoutUnit logicalLeftOffset() const;
144
145     LayoutUnit m_referenceBoxLineTop;
146     LayoutUnit m_lineHeight;
147
148     const RenderType& m_renderer;
149
150 private:
151     mutable OwnPtr<Shape> m_shape;
152     LayoutSize m_referenceBoxLogicalSize;
153 };
154
155 bool checkShapeImageOrigin(Document&, CachedImage&);
156
157 }
158 #endif
159 #endif