[CSS Shapes] CORS-enabled fetch for shape image values
[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, InfoType::createInfo(key));
54         return result.iterator->value.get();
55     }
56     static void removeInfo(const KeyType* key) { infoMap().remove(key); }
57     static InfoType* info(const KeyType* key) { return infoMap().get(key); }
58 private:
59     typedef HashMap<const KeyType*, OwnPtr<InfoType>> InfoMap;
60     static InfoMap& infoMap()
61     {
62         DEFINE_STATIC_LOCAL(InfoMap, staticInfoMap, ());
63         return staticInfoMap;
64     }
65 };
66
67 template<class RenderType>
68 class ShapeInfo {
69     WTF_MAKE_FAST_ALLOCATED;
70 public:
71     virtual ~ShapeInfo() { }
72
73     void setShapeSize(LayoutUnit logicalWidth, LayoutUnit logicalHeight)
74     {
75         LayoutSize newLogicalSize(logicalWidth, logicalHeight);
76
77         if (m_renderer->style()->boxSizing() == CONTENT_BOX)
78             newLogicalSize -= LayoutSize(m_renderer->borderAndPaddingLogicalWidth(), m_renderer->borderAndPaddingLogicalHeight());
79
80         if (m_shapeLogicalSize == newLogicalSize)
81             return;
82         dirtyShapeSize();
83         m_shapeLogicalSize = newLogicalSize;
84     }
85
86     SegmentList computeSegmentsForLine(LayoutUnit lineTop, LayoutUnit lineHeight) const;
87
88     LayoutUnit shapeLogicalTop() const { return computedShapeLogicalBoundingBox().y() + logicalTopOffset(); }
89     LayoutUnit shapeLogicalBottom() const { return computedShapeLogicalBoundingBox().maxY() + logicalTopOffset(); }
90     LayoutUnit shapeLogicalLeft() const { return computedShapeLogicalBoundingBox().x() + logicalLeftOffset(); }
91     LayoutUnit shapeLogicalRight() const { return computedShapeLogicalBoundingBox().maxX() + logicalLeftOffset(); }
92     LayoutUnit shapeLogicalWidth() const { return computedShapeLogicalBoundingBox().width(); }
93     LayoutUnit shapeLogicalHeight() const { return computedShapeLogicalBoundingBox().height(); }
94
95     LayoutUnit logicalLineTop() const { return m_shapeLineTop + logicalTopOffset(); }
96     LayoutUnit logicalLineBottom() const { return m_shapeLineTop + m_lineHeight + logicalTopOffset(); }
97     LayoutUnit logicalLineBottom(LayoutUnit lineHeight) const { return m_shapeLineTop + lineHeight + logicalTopOffset(); }
98
99     LayoutUnit shapeContainingBlockLogicalHeight() const { return (m_renderer->style()->boxSizing() == CONTENT_BOX) ? (m_shapeLogicalSize.height() + m_renderer->borderAndPaddingLogicalHeight()) : m_shapeLogicalSize.height(); }
100
101     virtual bool lineOverlapsShapeBounds() const = 0;
102
103     void dirtyShapeSize() { m_shape.clear(); }
104     bool shapeSizeDirty() { return !m_shape.get(); }
105     const RenderType* owner() const { return m_renderer; }
106     LayoutSize shapeSize() const { return m_shapeLogicalSize; }
107
108 protected:
109     ShapeInfo(const RenderType* renderer): m_renderer(renderer) { }
110
111     const Shape* computedShape() const;
112
113     virtual LayoutRect computedShapeLogicalBoundingBox() const = 0;
114     virtual ShapeValue* shapeValue() const = 0;
115     virtual void getIntervals(LayoutUnit, LayoutUnit, SegmentList&) const = 0;
116
117     LayoutUnit logicalTopOffset() const { return m_renderer->style()->boxSizing() == CONTENT_BOX ? m_renderer->borderAndPaddingBefore() : LayoutUnit(); };
118     LayoutUnit logicalLeftOffset() const { return (m_renderer->style()->boxSizing() == CONTENT_BOX && !m_renderer->isRenderRegion()) ? m_renderer->borderAndPaddingStart() : LayoutUnit(); }
119
120     LayoutUnit m_shapeLineTop;
121     LayoutUnit m_lineHeight;
122
123     const RenderType* m_renderer;
124
125 private:
126     mutable OwnPtr<Shape> m_shape;
127     LayoutSize m_shapeLogicalSize;
128 };
129
130 bool checkShapeImageOrigin(Document&, CachedImage&);
131
132 }
133 #endif
134 #endif