Combine event and touch action regions into a single class
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / PlatformCALayer.h
1 /*
2  * Copyright (C) 2010, 2014 Apple Inc. 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "FloatRoundedRect.h"
29 #include "GraphicsLayer.h"
30 #include <QuartzCore/CABase.h>
31 #include <wtf/RefCounted.h>
32 #include <wtf/RetainPtr.h>
33 #include <wtf/TypeCasts.h>
34 #include <wtf/Vector.h>
35
36 OBJC_CLASS AVPlayerLayer;
37
38 #if PLATFORM(COCOA)
39 typedef struct CGContext *CGContextRef;
40 #endif
41
42 namespace WebCore {
43
44 class LayerPool;
45 class PlatformCALayer;
46 class PlatformCAAnimation;
47 class PlatformCALayerClient;
48
49 typedef Vector<RefPtr<PlatformCALayer>> PlatformCALayerList;
50
51 class WEBCORE_EXPORT PlatformCALayer : public RefCounted<PlatformCALayer> {
52 #if PLATFORM(COCOA)
53     friend class PlatformCALayerCocoa;
54 #elif PLATFORM(WIN)
55     friend class PlatformCALayerWin;
56 #endif
57 public:
58     static CFTimeInterval currentTimeToMediaTime(MonotonicTime t) { return CACurrentMediaTime() + (t - MonotonicTime::now()).seconds(); }
59
60     // LayerTypeRootLayer is used on some platforms. It has no backing store, so setNeedsDisplay
61     // should not call CACFLayerSetNeedsDisplay, but rather just notify the renderer that it
62     // has changed and should be re-rendered.
63     enum LayerType {
64         LayerTypeLayer,
65         LayerTypeWebLayer,
66         LayerTypeSimpleLayer,
67         LayerTypeTransformLayer,
68         LayerTypeTiledBackingLayer,
69         LayerTypePageTiledBackingLayer,
70         LayerTypeTiledBackingTileLayer,
71         LayerTypeRootLayer,
72         LayerTypeAVPlayerLayer,
73         LayerTypeContentsProvidedLayer,
74         LayerTypeBackdropLayer,
75         LayerTypeShapeLayer,
76         LayerTypeLightSystemBackdropLayer,
77         LayerTypeDarkSystemBackdropLayer,
78         LayerTypeScrollContainerLayer,
79         LayerTypeEditableImageLayer,
80         LayerTypeCustom,
81     };
82     enum FilterType { Linear, Nearest, Trilinear };
83
84     virtual Ref<PlatformCALayer> clone(PlatformCALayerClient*) const = 0;
85
86     virtual ~PlatformCALayer();
87
88     GraphicsLayer::PlatformLayerID layerID() const { return m_layerID; }
89
90     virtual bool isPlatformCALayerCocoa() const { return false; }
91     virtual bool isPlatformCALayerRemote() const { return false; }
92     virtual bool isPlatformCALayerRemoteCustom() const { return false; }
93
94     // This function passes the layer as a void* rather than a PlatformLayer because PlatformLayer
95     // is defined differently for Obj C and C++. This allows callers from both languages.
96     static PlatformCALayer* platformCALayer(void* platformLayer);
97
98     virtual PlatformLayer* platformLayer() const { return m_layer.get(); }
99
100     bool usesTiledBackingLayer() const { return layerType() == LayerTypePageTiledBackingLayer || layerType() == LayerTypeTiledBackingLayer; }
101
102     PlatformCALayerClient* owner() const { return m_owner; }
103     virtual void setOwner(PlatformCALayerClient* owner) { m_owner = owner; }
104
105     virtual void animationStarted(const String& key, MonotonicTime beginTime) = 0;
106     virtual void animationEnded(const String& key) = 0;
107
108     virtual void setNeedsDisplay() = 0;
109     virtual void setNeedsDisplayInRect(const FloatRect& dirtyRect) = 0;
110
111     virtual void copyContentsFromLayer(PlatformCALayer*) = 0;
112
113     LayerType layerType() const { return m_layerType; }
114     
115     bool canHaveBackingStore() const;
116
117     virtual PlatformCALayer* superlayer() const = 0;
118     virtual void removeFromSuperlayer() = 0;
119     virtual void setSublayers(const PlatformCALayerList&) = 0;
120     virtual void removeAllSublayers() = 0;
121     virtual void appendSublayer(PlatformCALayer&) = 0;
122     virtual void insertSublayer(PlatformCALayer&, size_t index) = 0;
123     virtual void replaceSublayer(PlatformCALayer& reference, PlatformCALayer&) = 0;
124
125     // A list of sublayers that GraphicsLayerCA should maintain as the first sublayers.
126     virtual const PlatformCALayerList* customSublayers() const = 0;
127
128     // This method removes the sublayers from the source and reparents them to the current layer.
129     // Any sublayers previously in the current layer are removed.
130     virtual void adoptSublayers(PlatformCALayer& source) = 0;
131
132     virtual void addAnimationForKey(const String& key, PlatformCAAnimation&) = 0;
133     virtual void removeAnimationForKey(const String& key) = 0;
134     virtual RefPtr<PlatformCAAnimation> animationForKey(const String& key) = 0;
135
136     virtual void setMask(PlatformCALayer*) = 0;
137
138     virtual bool isOpaque() const = 0;
139     virtual void setOpaque(bool) = 0;
140
141     virtual FloatRect bounds() const = 0;
142     virtual void setBounds(const FloatRect&) = 0;
143
144     virtual FloatPoint3D position() const = 0;
145     virtual void setPosition(const FloatPoint3D&) = 0;
146     void setPosition(const FloatPoint& pos) { setPosition(FloatPoint3D(pos.x(), pos.y(), 0)); }
147
148     virtual FloatPoint3D anchorPoint() const = 0;
149     virtual void setAnchorPoint(const FloatPoint3D&) = 0;
150
151     virtual TransformationMatrix transform() const = 0;
152     virtual void setTransform(const TransformationMatrix&) = 0;
153
154     virtual TransformationMatrix sublayerTransform() const = 0;
155     virtual void setSublayerTransform(const TransformationMatrix&) = 0;
156
157     virtual bool isHidden() const = 0;
158     virtual void setHidden(bool) = 0;
159
160     // Used to disable user interaction for some platforms.
161     virtual bool contentsHidden() const = 0;
162     virtual void setContentsHidden(bool) = 0;
163     virtual bool userInteractionEnabled() const = 0;
164     virtual void setUserInteractionEnabled(bool) = 0;
165
166     virtual bool geometryFlipped() const = 0;
167     virtual void setGeometryFlipped(bool) = 0;
168
169     virtual bool isDoubleSided() const = 0;
170     virtual void setDoubleSided(bool) = 0;
171
172     virtual bool masksToBounds() const = 0;
173     virtual void setMasksToBounds(bool) = 0;
174
175     virtual bool acceleratesDrawing() const = 0;
176     virtual void setAcceleratesDrawing(bool) = 0;
177
178     virtual bool wantsDeepColorBackingStore() const = 0;
179     virtual void setWantsDeepColorBackingStore(bool) = 0;
180
181     virtual bool supportsSubpixelAntialiasedText() const = 0;
182     virtual void setSupportsSubpixelAntialiasedText(bool) = 0;
183
184     virtual bool hasContents() const = 0;
185     virtual CFTypeRef contents() const = 0;
186     virtual void setContents(CFTypeRef) = 0;
187
188     virtual void setContentsRect(const FloatRect&) = 0;
189
190     virtual void setBackingStoreAttached(bool) = 0;
191     virtual bool backingStoreAttached() const = 0;
192
193     virtual void setMinificationFilter(FilterType) = 0;
194     virtual void setMagnificationFilter(FilterType) = 0;
195
196     virtual Color backgroundColor() const = 0;
197     virtual void setBackgroundColor(const Color&) = 0;
198
199     virtual void setBorderWidth(float) = 0;
200
201     virtual void setBorderColor(const Color&) = 0;
202
203     virtual float opacity() const = 0;
204     virtual void setOpacity(float) = 0;
205     virtual void setFilters(const FilterOperations&) = 0;
206     virtual void copyFiltersFrom(const PlatformCALayer&) = 0;
207
208 #if ENABLE(CSS_COMPOSITING)
209     virtual void setBlendMode(BlendMode) = 0;
210 #endif
211
212     virtual void setName(const String&) = 0;
213
214     virtual void setSpeed(float) = 0;
215
216     virtual void setTimeOffset(CFTimeInterval) = 0;
217
218     virtual float contentsScale() const = 0;
219     virtual void setContentsScale(float) = 0;
220
221     virtual float cornerRadius() const = 0;
222     virtual void setCornerRadius(float) = 0;
223
224     virtual void setEdgeAntialiasingMask(unsigned) = 0;
225     
226     // Only used by LayerTypeShapeLayer.
227     virtual FloatRoundedRect shapeRoundedRect() const = 0;
228     virtual void setShapeRoundedRect(const FloatRoundedRect&) = 0;
229
230     // Only used by LayerTypeShapeLayer.
231     virtual Path shapePath() const = 0;
232     virtual void setShapePath(const Path&) = 0;
233
234     virtual WindRule shapeWindRule() const = 0;
235     virtual void setShapeWindRule(WindRule) = 0;
236
237     virtual void setEventRegion(const EventRegion&) = 0;
238     
239     virtual GraphicsLayer::CustomAppearance customAppearance() const = 0;
240     virtual void updateCustomAppearance(GraphicsLayer::CustomAppearance) = 0;
241
242     virtual GraphicsLayer::EmbeddedViewID embeddedViewID() const = 0;
243
244     virtual TiledBacking* tiledBacking() = 0;
245
246     virtual void drawTextAtPoint(CGContextRef, CGFloat x, CGFloat y, CGSize scale, CGFloat fontSize, const char* text, size_t length, CGFloat strokeWidthAsPercentageOfFontSize = 0, Color strokeColor = Color()) const;
247
248     static void flipContext(CGContextRef, CGFloat height);
249     
250     virtual unsigned backingStoreBytesPerPixel() const { return 4; }
251
252 #if PLATFORM(WIN)
253     virtual PlatformCALayer* rootLayer() const = 0;
254     virtual void setNeedsLayout() = 0;
255     virtual void setNeedsCommit() = 0;
256     virtual String layerTreeAsString() const = 0;
257 #endif // PLATFORM(WIN)
258
259 #if PLATFORM(IOS_FAMILY)
260     bool isWebLayer();
261     void setBoundsOnMainThread(CGRect);
262     void setPositionOnMainThread(CGPoint);
263     void setAnchorPointOnMainThread(FloatPoint3D);
264 #endif
265
266     virtual Ref<PlatformCALayer> createCompatibleLayer(LayerType, PlatformCALayerClient*) const = 0;
267     Ref<PlatformCALayer> createCompatibleLayerOrTakeFromPool(LayerType, PlatformCALayerClient*, IntSize);
268
269 #if PLATFORM(COCOA)
270     virtual void enumerateRectsBeingDrawn(CGContextRef, void (^block)(CGRect)) = 0;
271 #endif
272
273     static const unsigned webLayerMaxRectsToPaint = 5;
274 #if COMPILER(MSVC)
275     static const float webLayerWastedSpaceThreshold;
276 #else
277     constexpr static const float webLayerWastedSpaceThreshold = 0.75f;
278 #endif
279
280     typedef Vector<FloatRect, webLayerMaxRectsToPaint> RepaintRectList;
281         
282     // Functions allows us to share implementation across WebTiledLayer and WebLayer
283     static RepaintRectList collectRectsToPaint(CGContextRef, PlatformCALayer*);
284     static void drawLayerContents(CGContextRef, PlatformCALayer*, RepaintRectList& dirtyRects, GraphicsLayerPaintBehavior);
285     static void drawRepaintIndicator(CGContextRef, PlatformCALayer*, int repaintCount, CGColorRef customBackgroundColor);
286     static CGRect frameForLayer(const PlatformLayer*);
287
288     void moveToLayerPool();
289
290 protected:
291     PlatformCALayer(LayerType, PlatformCALayerClient* owner);
292
293     virtual LayerPool& layerPool();
294
295     const LayerType m_layerType;
296     const GraphicsLayer::PlatformLayerID m_layerID;
297     RetainPtr<PlatformLayer> m_layer;
298     PlatformCALayerClient* m_owner;
299 };
300
301 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, PlatformCALayer::LayerType);
302 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, PlatformCALayer::FilterType);
303
304 } // namespace WebCore
305
306 #define SPECIALIZE_TYPE_TRAITS_PLATFORM_CALAYER(ToValueTypeName, predicate) \
307 SPECIALIZE_TYPE_TRAITS_BEGIN(ToValueTypeName) \
308     static bool isType(const WebCore::PlatformCALayer& layer) { return layer.predicate; } \
309 SPECIALIZE_TYPE_TRAITS_END()