[WTF] Move currentCPUTime and sleep(Seconds) to CPUTime.h and Seconds.h respectively
[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         LayerTypeScrollingLayer,
79         LayerTypeCustom
80     };
81     enum FilterType { Linear, Nearest, Trilinear };
82
83     virtual Ref<PlatformCALayer> clone(PlatformCALayerClient*) const = 0;
84
85     virtual ~PlatformCALayer();
86
87     GraphicsLayer::PlatformLayerID layerID() const { return m_layerID; }
88
89     virtual bool isPlatformCALayerCocoa() const { return false; }
90     virtual bool isPlatformCALayerRemote() const { return false; }
91     virtual bool isPlatformCALayerRemoteCustom() const { return false; }
92
93     // This function passes the layer as a void* rather than a PlatformLayer because PlatformLayer
94     // is defined differently for Obj C and C++. This allows callers from both languages.
95     static PlatformCALayer* platformCALayer(void* platformLayer);
96
97     virtual PlatformLayer* platformLayer() const { return m_layer.get(); }
98
99     bool usesTiledBackingLayer() const { return layerType() == LayerTypePageTiledBackingLayer || layerType() == LayerTypeTiledBackingLayer; }
100
101     PlatformCALayerClient* owner() const { return m_owner; }
102     virtual void setOwner(PlatformCALayerClient* owner) { m_owner = owner; }
103
104     virtual void animationStarted(const String& key, MonotonicTime beginTime) = 0;
105     virtual void animationEnded(const String& key) = 0;
106
107     virtual void setNeedsDisplay() = 0;
108     virtual void setNeedsDisplayInRect(const FloatRect& dirtyRect) = 0;
109
110     virtual void copyContentsFromLayer(PlatformCALayer*) = 0;
111
112     LayerType layerType() const { return m_layerType; }
113     
114     bool canHaveBackingStore() const;
115
116     virtual PlatformCALayer* superlayer() const = 0;
117     virtual void removeFromSuperlayer() = 0;
118     virtual void setSublayers(const PlatformCALayerList&) = 0;
119     virtual void removeAllSublayers() = 0;
120     virtual void appendSublayer(PlatformCALayer&) = 0;
121     virtual void insertSublayer(PlatformCALayer&, size_t index) = 0;
122     virtual void replaceSublayer(PlatformCALayer& reference, PlatformCALayer&) = 0;
123
124     // A list of sublayers that GraphicsLayerCA should maintain as the first sublayers.
125     virtual const PlatformCALayerList* customSublayers() const = 0;
126
127     // This method removes the sublayers from the source and reparents them to the current layer.
128     // Any sublayers previously in the current layer are removed.
129     virtual void adoptSublayers(PlatformCALayer& source) = 0;
130
131     virtual void addAnimationForKey(const String& key, PlatformCAAnimation&) = 0;
132     virtual void removeAnimationForKey(const String& key) = 0;
133     virtual RefPtr<PlatformCAAnimation> animationForKey(const String& key) = 0;
134
135     virtual void setMask(PlatformCALayer*) = 0;
136
137     virtual bool isOpaque() const = 0;
138     virtual void setOpaque(bool) = 0;
139
140     virtual FloatRect bounds() const = 0;
141     virtual void setBounds(const FloatRect&) = 0;
142
143     virtual FloatPoint3D position() const = 0;
144     virtual void setPosition(const FloatPoint3D&) = 0;
145     void setPosition(const FloatPoint& pos) { setPosition(FloatPoint3D(pos.x(), pos.y(), 0)); }
146
147     virtual FloatPoint3D anchorPoint() const = 0;
148     virtual void setAnchorPoint(const FloatPoint3D&) = 0;
149
150     virtual TransformationMatrix transform() const = 0;
151     virtual void setTransform(const TransformationMatrix&) = 0;
152
153     virtual TransformationMatrix sublayerTransform() const = 0;
154     virtual void setSublayerTransform(const TransformationMatrix&) = 0;
155
156     virtual bool isHidden() const = 0;
157     virtual void setHidden(bool) = 0;
158
159     // Used to disable user interaction for some platforms.
160     virtual bool contentsHidden() const = 0;
161     virtual void setContentsHidden(bool) = 0;
162     virtual bool userInteractionEnabled() const = 0;
163     virtual void setUserInteractionEnabled(bool) = 0;
164
165     virtual bool geometryFlipped() const = 0;
166     virtual void setGeometryFlipped(bool) = 0;
167
168     virtual bool isDoubleSided() const = 0;
169     virtual void setDoubleSided(bool) = 0;
170
171     virtual bool masksToBounds() const = 0;
172     virtual void setMasksToBounds(bool) = 0;
173
174     virtual bool acceleratesDrawing() const = 0;
175     virtual void setAcceleratesDrawing(bool) = 0;
176
177     virtual bool wantsDeepColorBackingStore() const = 0;
178     virtual void setWantsDeepColorBackingStore(bool) = 0;
179
180     virtual bool supportsSubpixelAntialiasedText() const = 0;
181     virtual void setSupportsSubpixelAntialiasedText(bool) = 0;
182
183     virtual CFTypeRef contents() const = 0;
184     virtual void setContents(CFTypeRef) = 0;
185
186     virtual void setContentsRect(const FloatRect&) = 0;
187
188     virtual void setBackingStoreAttached(bool) = 0;
189     virtual bool backingStoreAttached() const = 0;
190
191     virtual void setMinificationFilter(FilterType) = 0;
192     virtual void setMagnificationFilter(FilterType) = 0;
193
194     virtual Color backgroundColor() const = 0;
195     virtual void setBackgroundColor(const Color&) = 0;
196
197     virtual void setBorderWidth(float) = 0;
198
199     virtual void setBorderColor(const Color&) = 0;
200
201     virtual float opacity() const = 0;
202     virtual void setOpacity(float) = 0;
203     virtual void setFilters(const FilterOperations&) = 0;
204     virtual void copyFiltersFrom(const PlatformCALayer&) = 0;
205
206 #if ENABLE(CSS_COMPOSITING)
207     virtual void setBlendMode(BlendMode) = 0;
208 #endif
209
210     virtual void setName(const String&) = 0;
211
212     virtual void setSpeed(float) = 0;
213
214     virtual void setTimeOffset(CFTimeInterval) = 0;
215
216     virtual float contentsScale() const = 0;
217     virtual void setContentsScale(float) = 0;
218
219     virtual float cornerRadius() const = 0;
220     virtual void setCornerRadius(float) = 0;
221
222     virtual void setEdgeAntialiasingMask(unsigned) = 0;
223     
224     // Only used by LayerTypeShapeLayer.
225     virtual FloatRoundedRect shapeRoundedRect() const = 0;
226     virtual void setShapeRoundedRect(const FloatRoundedRect&) = 0;
227
228     // Only used by LayerTypeShapeLayer.
229     virtual Path shapePath() const = 0;
230     virtual void setShapePath(const Path&) = 0;
231
232     virtual WindRule shapeWindRule() const = 0;
233     virtual void setShapeWindRule(WindRule) = 0;
234     
235     virtual GraphicsLayer::CustomAppearance customAppearance() const = 0;
236     virtual void updateCustomAppearance(GraphicsLayer::CustomAppearance) = 0;
237
238     virtual TiledBacking* tiledBacking() = 0;
239
240     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;
241
242     static void flipContext(CGContextRef, CGFloat height);
243     
244     virtual unsigned backingStoreBytesPerPixel() const { return 4; }
245
246 #if PLATFORM(WIN)
247     virtual PlatformCALayer* rootLayer() const = 0;
248     virtual void setNeedsLayout() = 0;
249     virtual void setNeedsCommit() = 0;
250     virtual String layerTreeAsString() const = 0;
251 #endif // PLATFORM(WIN)
252
253 #if PLATFORM(IOS)
254     bool isWebLayer();
255     void setBoundsOnMainThread(CGRect);
256     void setPositionOnMainThread(CGPoint);
257     void setAnchorPointOnMainThread(FloatPoint3D);
258 #endif
259
260     virtual Ref<PlatformCALayer> createCompatibleLayer(LayerType, PlatformCALayerClient*) const = 0;
261     Ref<PlatformCALayer> createCompatibleLayerOrTakeFromPool(LayerType, PlatformCALayerClient*, IntSize);
262
263 #if PLATFORM(COCOA)
264     virtual void enumerateRectsBeingDrawn(CGContextRef, void (^block)(CGRect)) = 0;
265 #endif
266
267     static const unsigned webLayerMaxRectsToPaint = 5;
268 #if COMPILER(MSVC)
269     static const float webLayerWastedSpaceThreshold;
270 #else
271     constexpr static const float webLayerWastedSpaceThreshold = 0.75f;
272 #endif
273
274     typedef Vector<FloatRect, webLayerMaxRectsToPaint> RepaintRectList;
275         
276     // Functions allows us to share implementation across WebTiledLayer and WebLayer
277     static RepaintRectList collectRectsToPaint(CGContextRef, PlatformCALayer*);
278     static void drawLayerContents(CGContextRef, PlatformCALayer*, RepaintRectList& dirtyRects, GraphicsLayerPaintBehavior);
279     static void drawRepaintIndicator(CGContextRef, PlatformCALayer*, int repaintCount, CGColorRef customBackgroundColor);
280     static CGRect frameForLayer(const PlatformLayer*);
281
282     void moveToLayerPool();
283
284 protected:
285     PlatformCALayer(LayerType, PlatformCALayerClient* owner);
286
287     virtual LayerPool& layerPool();
288
289     const LayerType m_layerType;
290     const GraphicsLayer::PlatformLayerID m_layerID;
291     RetainPtr<PlatformLayer> m_layer;
292     PlatformCALayerClient* m_owner;
293 };
294
295 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, PlatformCALayer::LayerType);
296 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, PlatformCALayer::FilterType);
297
298 } // namespace WebCore
299
300 #define SPECIALIZE_TYPE_TRAITS_PLATFORM_CALAYER(ToValueTypeName, predicate) \
301 SPECIALIZE_TYPE_TRAITS_BEGIN(ToValueTypeName) \
302     static bool isType(const WebCore::PlatformCALayer& layer) { return layer.predicate; } \
303 SPECIALIZE_TYPE_TRAITS_END()