Font antialiasing (smoothing) changes when elements are rendered into compositing...
[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 #ifndef PlatformCALayer_h
27 #define PlatformCALayer_h
28
29 #include "FloatRoundedRect.h"
30 #include "GraphicsLayer.h"
31 #include <QuartzCore/CABase.h>
32 #include <wtf/CurrentTime.h>
33 #include <wtf/PassRefPtr.h>
34 #include <wtf/RefCounted.h>
35 #include <wtf/RetainPtr.h>
36 #include <wtf/TypeCasts.h>
37 #include <wtf/Vector.h>
38
39 OBJC_CLASS AVPlayerLayer;
40
41 #if PLATFORM(COCOA)
42 typedef struct CGContext *CGContextRef;
43 #endif
44
45 namespace WebCore {
46
47 class LayerPool;
48 class PlatformCALayer;
49 class PlatformCAAnimation;
50 class PlatformCALayerClient;
51
52 typedef Vector<RefPtr<PlatformCALayer>> PlatformCALayerList;
53
54 class WEBCORE_EXPORT PlatformCALayer : public RefCounted<PlatformCALayer> {
55 #if PLATFORM(COCOA)
56     friend class PlatformCALayerCocoa;
57 #elif PLATFORM(WIN)
58     friend class PlatformCALayerWin;
59 #endif
60 public:
61     static CFTimeInterval currentTimeToMediaTime(double t) { return CACurrentMediaTime() + t - monotonicallyIncreasingTime(); }
62
63     // LayerTypeRootLayer is used on some platforms. It has no backing store, so setNeedsDisplay
64     // should not call CACFLayerSetNeedsDisplay, but rather just notify the renderer that it
65     // has changed and should be re-rendered.
66     enum LayerType {
67         LayerTypeLayer,
68         LayerTypeWebLayer,
69         LayerTypeSimpleLayer,
70         LayerTypeTransformLayer,
71         LayerTypeWebTiledLayer,
72         LayerTypeTiledBackingLayer,
73         LayerTypePageTiledBackingLayer,
74         LayerTypeTiledBackingTileLayer,
75         LayerTypeRootLayer,
76         LayerTypeAVPlayerLayer,
77         LayerTypeWebGLLayer,
78         LayerTypeBackdropLayer,
79         LayerTypeShapeLayer,
80         LayerTypeLightSystemBackdropLayer,
81         LayerTypeDarkSystemBackdropLayer,
82         LayerTypeScrollingLayer,
83         LayerTypeCustom
84     };
85     enum FilterType { Linear, Nearest, Trilinear };
86
87     virtual PassRefPtr<PlatformCALayer> clone(PlatformCALayerClient*) const = 0;
88
89     virtual ~PlatformCALayer();
90
91     GraphicsLayer::PlatformLayerID layerID() const { return m_layerID; }
92
93     virtual bool isPlatformCALayerCocoa() const { return false; }
94     virtual bool isPlatformCALayerRemote() const { return false; }
95     virtual bool isPlatformCALayerRemoteCustom() const { return false; }
96
97     // This function passes the layer as a void* rather than a PlatformLayer because PlatformLayer
98     // is defined differently for Obj C and C++. This allows callers from both languages.
99     static PlatformCALayer* platformCALayer(void* platformLayer);
100
101     virtual PlatformLayer* platformLayer() const { return m_layer.get(); }
102
103     bool usesTiledBackingLayer() const { return layerType() == LayerTypePageTiledBackingLayer || layerType() == LayerTypeTiledBackingLayer; }
104
105     PlatformCALayerClient* owner() const { return m_owner; }
106     virtual void setOwner(PlatformCALayerClient* owner) { m_owner = owner; }
107
108     virtual void animationStarted(const String& key, CFTimeInterval beginTime) = 0;
109     virtual void animationEnded(const String& key) = 0;
110
111     virtual void setNeedsDisplay() = 0;
112     virtual void setNeedsDisplayInRect(const FloatRect& dirtyRect) = 0;
113
114     virtual void copyContentsFromLayer(PlatformCALayer*) = 0;
115
116     LayerType layerType() const { return m_layerType; }
117
118     virtual PlatformCALayer* superlayer() const = 0;
119     virtual void removeFromSuperlayer() = 0;
120     virtual void setSublayers(const PlatformCALayerList&) = 0;
121     virtual void removeAllSublayers() = 0;
122     virtual void appendSublayer(PlatformCALayer&) = 0;
123     virtual void insertSublayer(PlatformCALayer&, size_t index) = 0;
124     virtual void replaceSublayer(PlatformCALayer& reference, PlatformCALayer&) = 0;
125
126     // A list of sublayers that GraphicsLayerCA should maintain as the first sublayers.
127     virtual const PlatformCALayerList* customSublayers() const = 0;
128
129     // This method removes the sublayers from the source and reparents them to the current layer.
130     // Any sublayers previously in the current layer are removed.
131     virtual void adoptSublayers(PlatformCALayer& source) = 0;
132
133     virtual void addAnimationForKey(const String& key, PlatformCAAnimation&) = 0;
134     virtual void removeAnimationForKey(const String& key) = 0;
135     virtual PassRefPtr<PlatformCAAnimation> animationForKey(const String& key) = 0;
136
137     virtual void setMask(PlatformCALayer*) = 0;
138
139     virtual bool isOpaque() const = 0;
140     virtual void setOpaque(bool) = 0;
141
142     enum ContentsFormatFlag {
143         DeepColor       = 1 << 0,
144         SmoothedFonts   = 1 << 1,
145     };
146     typedef unsigned ContentsFormatFlags;
147     virtual void setContentsFormat(ContentsFormatFlags) = 0;
148     virtual ContentsFormatFlags contentsFormat() const = 0;
149
150     virtual FloatRect bounds() const = 0;
151     virtual void setBounds(const FloatRect&) = 0;
152
153     virtual FloatPoint3D position() const = 0;
154     virtual void setPosition(const FloatPoint3D&) = 0;
155     void setPosition(const FloatPoint& pos) { setPosition(FloatPoint3D(pos.x(), pos.y(), 0)); }
156
157     virtual FloatPoint3D anchorPoint() const = 0;
158     virtual void setAnchorPoint(const FloatPoint3D&) = 0;
159
160     virtual TransformationMatrix transform() const = 0;
161     virtual void setTransform(const TransformationMatrix&) = 0;
162
163     virtual TransformationMatrix sublayerTransform() const = 0;
164     virtual void setSublayerTransform(const TransformationMatrix&) = 0;
165
166     virtual void setHidden(bool) = 0;
167
168     virtual bool geometryFlipped() const = 0;
169     virtual void setGeometryFlipped(bool) = 0;
170
171     virtual bool isDoubleSided() const = 0;
172     virtual void setDoubleSided(bool) = 0;
173
174     virtual bool masksToBounds() const = 0;
175     virtual void setMasksToBounds(bool) = 0;
176
177     virtual bool acceleratesDrawing() const = 0;
178     virtual void setAcceleratesDrawing(bool) = 0;
179
180     virtual CFTypeRef contents() const = 0;
181     virtual void setContents(CFTypeRef) = 0;
182
183     virtual void setContentsRect(const FloatRect&) = 0;
184
185     virtual void setBackingStoreAttached(bool) = 0;
186     virtual bool backingStoreAttached() const = 0;
187     virtual bool backingContributesToMemoryEstimate() const { return true; }
188
189     virtual void setMinificationFilter(FilterType) = 0;
190     virtual void setMagnificationFilter(FilterType) = 0;
191
192     virtual Color backgroundColor() const = 0;
193     virtual void setBackgroundColor(const Color&) = 0;
194
195     virtual void setBorderWidth(float) = 0;
196
197     virtual void setBorderColor(const Color&) = 0;
198
199     virtual float opacity() const = 0;
200     virtual void setOpacity(float) = 0;
201     virtual void setFilters(const FilterOperations&) = 0;
202     virtual void copyFiltersFrom(const PlatformCALayer&) = 0;
203
204 #if ENABLE(CSS_COMPOSITING)
205     virtual void setBlendMode(BlendMode) = 0;
206 #endif
207
208     virtual void setName(const String&) = 0;
209
210     virtual void setSpeed(float) = 0;
211
212     virtual void setTimeOffset(CFTimeInterval) = 0;
213
214     virtual float contentsScale() const = 0;
215     virtual void setContentsScale(float) = 0;
216
217     virtual float cornerRadius() const = 0;
218     virtual void setCornerRadius(float) = 0;
219
220     virtual void setEdgeAntialiasingMask(unsigned) = 0;
221     
222     // Only used by LayerTypeShapeLayer.
223     virtual FloatRoundedRect shapeRoundedRect() const = 0;
224     virtual void setShapeRoundedRect(const FloatRoundedRect&) = 0;
225
226     // Only used by LayerTypeShapeLayer.
227     virtual Path shapePath() const = 0;
228     virtual void setShapePath(const Path&) = 0;
229
230     virtual WindRule shapeWindRule() const = 0;
231     virtual void setShapeWindRule(WindRule) = 0;
232     
233     virtual GraphicsLayer::CustomAppearance customAppearance() const = 0;
234     virtual void updateCustomAppearance(GraphicsLayer::CustomAppearance) = 0;
235
236     virtual TiledBacking* tiledBacking() = 0;
237
238     virtual void drawTextAtPoint(CGContextRef, CGFloat x, CGFloat y, CGSize scale, CGFloat fontSize, const char* text, size_t length) const;
239
240     static void flipContext(CGContextRef, CGFloat height);
241     
242     virtual unsigned backingStoreBytesPerPixel() const { return 4; }
243
244 #if PLATFORM(WIN)
245     virtual PlatformCALayer* rootLayer() const = 0;
246     virtual void setNeedsLayout() = 0;
247     virtual void setNeedsCommit() = 0;
248     virtual String layerTreeAsString() const = 0;
249 #endif // PLATFORM(WIN)
250
251 #if PLATFORM(IOS)
252     bool isWebLayer();
253     void setBoundsOnMainThread(CGRect);
254     void setPositionOnMainThread(CGPoint);
255     void setAnchorPointOnMainThread(FloatPoint3D);
256 #endif
257
258     virtual PassRefPtr<PlatformCALayer> createCompatibleLayer(LayerType, PlatformCALayerClient*) const = 0;
259     PassRefPtr<PlatformCALayer> createCompatibleLayerOrTakeFromPool(LayerType layerType, PlatformCALayerClient* client, IntSize);
260
261 #if PLATFORM(COCOA)
262     virtual void enumerateRectsBeingDrawn(CGContextRef, void (^block)(CGRect)) = 0;
263 #endif
264
265     static const unsigned webLayerMaxRectsToPaint = 5;
266 #if COMPILER(MSVC)
267     static const float webLayerWastedSpaceThreshold;
268 #else
269     constexpr static const float webLayerWastedSpaceThreshold = 0.75f;
270 #endif
271
272     typedef Vector<FloatRect, webLayerMaxRectsToPaint> RepaintRectList;
273         
274     // Functions allows us to share implementation across WebTiledLayer and WebLayer
275     static RepaintRectList collectRectsToPaint(CGContextRef, PlatformCALayer*);
276     static void drawLayerContents(CGContextRef, PlatformCALayer*, RepaintRectList& dirtyRects);
277     static void drawRepaintIndicator(CGContextRef, PlatformCALayer*, int repaintCount, CGColorRef customBackgroundColor);
278     static CGRect frameForLayer(const PlatformLayer*);
279
280     void moveToLayerPool();
281
282 protected:
283     PlatformCALayer(LayerType, PlatformCALayerClient* owner);
284
285     virtual LayerPool& layerPool();
286
287     const LayerType m_layerType;
288     const GraphicsLayer::PlatformLayerID m_layerID;
289     RetainPtr<PlatformLayer> m_layer;
290     PlatformCALayerClient* m_owner;
291 };
292
293 WEBCORE_EXPORT TextStream& operator<<(TextStream&, PlatformCALayer::LayerType);
294 WEBCORE_EXPORT TextStream& operator<<(TextStream&, PlatformCALayer::FilterType);
295
296 } // namespace WebCore
297
298 #define SPECIALIZE_TYPE_TRAITS_PLATFORM_CALAYER(ToValueTypeName, predicate) \
299 SPECIALIZE_TYPE_TRAITS_BEGIN(ToValueTypeName) \
300     static bool isType(const WebCore::PlatformCALayer& layer) { return layer.predicate; } \
301 SPECIALIZE_TYPE_TRAITS_END()
302
303 #endif // PlatformCALayer_h