Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / platform / graphics / GraphicsLayer.h
1 /*
2  * Copyright (C) 2009-2017 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 "Animation.h"
29 #include "Color.h"
30 #include "FilterOperations.h"
31 #include "FloatPoint.h"
32 #include "FloatPoint3D.h"
33 #include "FloatRoundedRect.h"
34 #include "FloatSize.h"
35 #include "GraphicsLayerClient.h"
36 #include "Path.h"
37 #include "PlatformLayer.h"
38 #include "TransformOperations.h"
39 #include "WindRule.h"
40 #include <wtf/Function.h>
41 #include <wtf/TypeCasts.h>
42
43 #if ENABLE(CSS_COMPOSITING)
44 #include "GraphicsTypes.h"
45 #endif
46
47 namespace WTF {
48 class TextStream;
49 }
50
51 namespace WebCore {
52
53 class GraphicsContext;
54 class GraphicsLayerFactory;
55 class Image;
56 class TiledBacking;
57 class TimingFunction;
58 class TransformationMatrix;
59
60 namespace DisplayList {
61 typedef unsigned AsTextFlags;
62 }
63
64 // Base class for animation values (also used for transitions). Here to
65 // represent values for properties being animated via the GraphicsLayer,
66 // without pulling in style-related data from outside of the platform directory.
67 // FIXME: Should be moved to its own header file.
68 class AnimationValue {
69     WTF_MAKE_FAST_ALLOCATED;
70 public:
71     virtual ~AnimationValue() = default;
72
73     double keyTime() const { return m_keyTime; }
74     const TimingFunction* timingFunction() const { return m_timingFunction.get(); }
75     virtual std::unique_ptr<AnimationValue> clone() const = 0;
76
77 protected:
78     AnimationValue(double keyTime, TimingFunction* timingFunction = nullptr)
79         : m_keyTime(keyTime)
80         , m_timingFunction(timingFunction)
81     {
82     }
83
84     AnimationValue(const AnimationValue& other)
85         : m_keyTime(other.m_keyTime)
86         , m_timingFunction(other.m_timingFunction ? RefPtr<TimingFunction> { other.m_timingFunction->clone() } : nullptr)
87     {
88     }
89
90     AnimationValue(AnimationValue&&) = default;
91
92 private:
93     void operator=(const AnimationValue&) = delete;
94
95     double m_keyTime;
96     RefPtr<TimingFunction> m_timingFunction;
97 };
98
99 // Used to store one float value of an animation.
100 // FIXME: Should be moved to its own header file.
101 class FloatAnimationValue : public AnimationValue {
102 public:
103     FloatAnimationValue(double keyTime, float value, TimingFunction* timingFunction = nullptr)
104         : AnimationValue(keyTime, timingFunction)
105         , m_value(value)
106     {
107     }
108
109     std::unique_ptr<AnimationValue> clone() const override
110     {
111         return std::make_unique<FloatAnimationValue>(*this);
112     }
113
114     float value() const { return m_value; }
115
116 private:
117     float m_value;
118 };
119
120 // Used to store one transform value in a keyframe list.
121 // FIXME: Should be moved to its own header file.
122 class TransformAnimationValue : public AnimationValue {
123 public:
124     TransformAnimationValue(double keyTime, const TransformOperations& value, TimingFunction* timingFunction = nullptr)
125         : AnimationValue(keyTime, timingFunction)
126         , m_value(value)
127     {
128     }
129
130     std::unique_ptr<AnimationValue> clone() const override
131     {
132         return std::make_unique<TransformAnimationValue>(*this);
133     }
134
135     TransformAnimationValue(const TransformAnimationValue& other)
136         : AnimationValue(other)
137     {
138         m_value.operations().reserveInitialCapacity(other.m_value.operations().size());
139         for (auto& operation : other.m_value.operations())
140             m_value.operations().uncheckedAppend(operation->clone());
141     }
142
143     TransformAnimationValue(TransformAnimationValue&&) = default;
144
145     const TransformOperations& value() const { return m_value; }
146
147 private:
148     TransformOperations m_value;
149 };
150
151 // Used to store one filter value in a keyframe list.
152 // FIXME: Should be moved to its own header file.
153 class FilterAnimationValue : public AnimationValue {
154 public:
155     FilterAnimationValue(double keyTime, const FilterOperations& value, TimingFunction* timingFunction = nullptr)
156         : AnimationValue(keyTime, timingFunction)
157         , m_value(value)
158     {
159     }
160
161     std::unique_ptr<AnimationValue> clone() const override
162     {
163         return std::make_unique<FilterAnimationValue>(*this);
164     }
165
166     FilterAnimationValue(const FilterAnimationValue& other)
167         : AnimationValue(other)
168     {
169         m_value.operations().reserveInitialCapacity(other.m_value.operations().size());
170         for (auto& operation : other.m_value.operations())
171             m_value.operations().uncheckedAppend(operation->clone());
172     }
173
174     FilterAnimationValue(FilterAnimationValue&&) = default;
175
176     const FilterOperations& value() const { return m_value; }
177
178 private:
179     FilterOperations m_value;
180 };
181
182 // Used to store a series of values in a keyframe list.
183 // Values will all be of the same type, which can be inferred from the property.
184 // FIXME: Should be moved to its own header file.
185 class KeyframeValueList {
186 public:
187     explicit KeyframeValueList(AnimatedPropertyID property)
188         : m_property(property)
189     {
190     }
191
192     KeyframeValueList(const KeyframeValueList& other)
193         : m_property(other.property())
194     {
195         m_values.reserveInitialCapacity(other.m_values.size());
196         for (auto& value : other.m_values)
197             m_values.uncheckedAppend(value->clone());
198     }
199
200     KeyframeValueList(KeyframeValueList&&) = default;
201
202     KeyframeValueList& operator=(const KeyframeValueList& other)
203     {
204         KeyframeValueList copy(other);
205         swap(copy);
206         return *this;
207     }
208
209     KeyframeValueList& operator=(KeyframeValueList&&) = default;
210
211     void swap(KeyframeValueList& other)
212     {
213         std::swap(m_property, other.m_property);
214         m_values.swap(other.m_values);
215     }
216
217     AnimatedPropertyID property() const { return m_property; }
218
219     size_t size() const { return m_values.size(); }
220     const AnimationValue& at(size_t i) const { return *m_values.at(i); }
221
222     // Insert, sorted by keyTime.
223     WEBCORE_EXPORT void insert(std::unique_ptr<const AnimationValue>);
224
225 protected:
226     Vector<std::unique_ptr<const AnimationValue>> m_values;
227     AnimatedPropertyID m_property;
228 };
229
230 // GraphicsLayer is an abstraction for a rendering surface with backing store,
231 // which may have associated transformation and animations.
232
233 class GraphicsLayer {
234     WTF_MAKE_NONCOPYABLE(GraphicsLayer); WTF_MAKE_FAST_ALLOCATED;
235 public:
236     enum class Type {
237         Normal,
238         PageTiledBacking,
239         Scrolling,
240         Shape
241     };
242     
243     WEBCORE_EXPORT static std::unique_ptr<GraphicsLayer> create(GraphicsLayerFactory*, GraphicsLayerClient&, Type = Type::Normal);
244     
245     WEBCORE_EXPORT virtual ~GraphicsLayer();
246     
247     Type type() const { return m_type; }
248
249     virtual void initialize(Type) { }
250
251     using PlatformLayerID = uint64_t;
252     virtual PlatformLayerID primaryLayerID() const { return 0; }
253
254     GraphicsLayerClient& client() const { return m_client; }
255
256     // Layer name. Only used to identify layers in debug output
257     const String& name() const { return m_name; }
258     virtual void setName(const String& name) { m_name = name; }
259
260     GraphicsLayer* parent() const { return m_parent; };
261     void setParent(GraphicsLayer*); // Internal use only.
262     
263     // Returns true if the layer has the given layer as an ancestor (excluding self).
264     bool hasAncestor(GraphicsLayer*) const;
265     
266     const Vector<GraphicsLayer*>& children() const { return m_children; }
267     // Returns true if the child list changed.
268     WEBCORE_EXPORT virtual bool setChildren(const Vector<GraphicsLayer*>&);
269
270     enum ContentsLayerPurpose {
271         NoContentsLayer = 0,
272         ContentsLayerForImage,
273         ContentsLayerForMedia,
274         ContentsLayerForCanvas,
275         ContentsLayerForBackgroundColor,
276         ContentsLayerForPlugin
277     };
278
279     // Add child layers. If the child is already parented, it will be removed from its old parent.
280     WEBCORE_EXPORT virtual void addChild(GraphicsLayer*);
281     WEBCORE_EXPORT virtual void addChildAtIndex(GraphicsLayer*, int index);
282     WEBCORE_EXPORT virtual void addChildAbove(GraphicsLayer*, GraphicsLayer* sibling);
283     WEBCORE_EXPORT virtual void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling);
284     WEBCORE_EXPORT virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild);
285
286     WEBCORE_EXPORT void removeAllChildren();
287     WEBCORE_EXPORT virtual void removeFromParent();
288
289     // The parent() of a maskLayer is set to the layer being masked.
290     GraphicsLayer* maskLayer() const { return m_maskLayer; }
291     virtual void setMaskLayer(GraphicsLayer*);
292
293     void setIsMaskLayer(bool isMask) { m_isMaskLayer = isMask; }
294     bool isMaskLayer() const { return m_isMaskLayer; }
295     
296     // The given layer will replicate this layer and its children; the replica renders behind this layer.
297     WEBCORE_EXPORT virtual void setReplicatedByLayer(GraphicsLayer*);
298     // Whether this layer is being replicated by another layer.
299     bool isReplicated() const { return m_replicaLayer; }
300     // The layer that replicates this layer (if any).
301     GraphicsLayer* replicaLayer() const { return m_replicaLayer; }
302
303     const FloatPoint& replicatedLayerPosition() const { return m_replicatedLayerPosition; }
304     void setReplicatedLayerPosition(const FloatPoint& p) { m_replicatedLayerPosition = p; }
305
306     enum ShouldSetNeedsDisplay {
307         DontSetNeedsDisplay,
308         SetNeedsDisplay
309     };
310
311     // Offset is origin of the renderer minus origin of the graphics layer.
312     FloatSize offsetFromRenderer() const { return m_offsetFromRenderer; }
313     void setOffsetFromRenderer(const FloatSize&, ShouldSetNeedsDisplay = SetNeedsDisplay);
314
315     // The position of the layer (the location of its top-left corner in its parent)
316     const FloatPoint& position() const { return m_position; }
317     virtual void setPosition(const FloatPoint& p) { m_approximatePosition = std::nullopt; m_position = p; }
318
319     // approximatePosition, if set, overrides position() and is used during coverage rect computation.
320     FloatPoint approximatePosition() const { return m_approximatePosition ? m_approximatePosition.value() : m_position; }
321     virtual void setApproximatePosition(const FloatPoint& p) { m_approximatePosition = p; }
322
323     // For platforms that move underlying platform layers on a different thread for scrolling; just update the GraphicsLayer state.
324     virtual void syncPosition(const FloatPoint& p) { m_position = p; }
325
326     // Anchor point: (0, 0) is top left, (1, 1) is bottom right. The anchor point
327     // affects the origin of the transforms.
328     const FloatPoint3D& anchorPoint() const { return m_anchorPoint; }
329     virtual void setAnchorPoint(const FloatPoint3D& p) { m_anchorPoint = p; }
330
331     // The size of the layer.
332     const FloatSize& size() const { return m_size; }
333     WEBCORE_EXPORT virtual void setSize(const FloatSize&);
334
335     // The boundOrigin affects the offset at which content is rendered, and sublayers are positioned.
336     const FloatPoint& boundsOrigin() const { return m_boundsOrigin; }
337     virtual void setBoundsOrigin(const FloatPoint& origin) { m_boundsOrigin = origin; }
338
339     // For platforms that move underlying platform layers on a different thread for scrolling; just update the GraphicsLayer state.
340     virtual void syncBoundsOrigin(const FloatPoint& origin) { m_boundsOrigin = origin; }
341
342     const TransformationMatrix& transform() const { return m_transform; }
343     virtual void setTransform(const TransformationMatrix& t) { m_transform = t; }
344
345     const TransformationMatrix& childrenTransform() const { return m_childrenTransform; }
346     virtual void setChildrenTransform(const TransformationMatrix& t) { m_childrenTransform = t; }
347
348     bool preserves3D() const { return m_preserves3D; }
349     virtual void setPreserves3D(bool b) { m_preserves3D = b; }
350     
351     bool masksToBounds() const { return m_masksToBounds; }
352     virtual void setMasksToBounds(bool b) { m_masksToBounds = b; }
353     
354     bool drawsContent() const { return m_drawsContent; }
355     virtual void setDrawsContent(bool b) { m_drawsContent = b; }
356
357     bool contentsAreVisible() const { return m_contentsVisible; }
358     virtual void setContentsVisible(bool b) { m_contentsVisible = b; }
359
360     bool userInteractionEnabled() const { return m_userInteractionEnabled; }
361     virtual void setUserInteractionEnabled(bool b) { m_userInteractionEnabled = b; }
362     
363     bool acceleratesDrawing() const { return m_acceleratesDrawing; }
364     virtual void setAcceleratesDrawing(bool b) { m_acceleratesDrawing = b; }
365
366     bool usesDisplayListDrawing() const { return m_usesDisplayListDrawing; }
367     virtual void setUsesDisplayListDrawing(bool b) { m_usesDisplayListDrawing = b; }
368
369     bool needsBackdrop() const { return !m_backdropFilters.isEmpty(); }
370
371     // The color used to paint the layer background. Pass an invalid color to remove it.
372     // Note that this covers the entire layer. Use setContentsToSolidColor() if the color should
373     // only cover the contentsRect.
374     const Color& backgroundColor() const { return m_backgroundColor; }
375     WEBCORE_EXPORT virtual void setBackgroundColor(const Color&);
376
377     // opaque means that we know the layer contents have no alpha
378     bool contentsOpaque() const { return m_contentsOpaque; }
379     virtual void setContentsOpaque(bool b) { m_contentsOpaque = b; }
380
381     bool supportsSubpixelAntialiasedText() const { return m_supportsSubpixelAntialiasedText; }
382     virtual void setSupportsSubpixelAntialiasedText(bool b) { m_supportsSubpixelAntialiasedText = b; }
383
384     bool backfaceVisibility() const { return m_backfaceVisibility; }
385     virtual void setBackfaceVisibility(bool b) { m_backfaceVisibility = b; }
386
387     float opacity() const { return m_opacity; }
388     virtual void setOpacity(float opacity) { m_opacity = opacity; }
389
390     const FilterOperations& filters() const { return m_filters; }
391     // Returns true if filter can be rendered by the compositor.
392     virtual bool setFilters(const FilterOperations& filters) { m_filters = filters; return true; }
393
394     const FilterOperations& backdropFilters() const { return m_backdropFilters; }
395     virtual bool setBackdropFilters(const FilterOperations& filters) { m_backdropFilters = filters; return true; }
396
397     virtual void setBackdropFiltersRect(const FloatRoundedRect& backdropFiltersRect) { m_backdropFiltersRect = backdropFiltersRect; }
398     const FloatRoundedRect& backdropFiltersRect() const { return m_backdropFiltersRect; }
399
400 #if ENABLE(CSS_COMPOSITING)
401     BlendMode blendMode() const { return m_blendMode; }
402     virtual void setBlendMode(BlendMode blendMode) { m_blendMode = blendMode; }
403 #endif
404
405     // Some GraphicsLayers paint only the foreground or the background content
406     GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; }
407     void setPaintingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; }
408
409     enum ShouldClipToLayer {
410         DoNotClipToLayer,
411         ClipToLayer
412     };
413
414     virtual void setNeedsDisplay() = 0;
415     // mark the given rect (in layer coords) as needing dispay. Never goes deep.
416     virtual void setNeedsDisplayInRect(const FloatRect&, ShouldClipToLayer = ClipToLayer) = 0;
417
418     virtual void setContentsNeedsDisplay() { };
419
420     // The tile phase is relative to the GraphicsLayer bounds.
421     virtual void setContentsTilePhase(const FloatSize& p) { m_contentsTilePhase = p; }
422     FloatSize contentsTilePhase() const { return m_contentsTilePhase; }
423
424     virtual void setContentsTileSize(const FloatSize& s) { m_contentsTileSize = s; }
425     FloatSize contentsTileSize() const { return m_contentsTileSize; }
426     bool hasContentsTiling() const { return !m_contentsTileSize.isEmpty(); }
427
428     // Set that the position/size of the contents (image or video).
429     FloatRect contentsRect() const { return m_contentsRect; }
430     virtual void setContentsRect(const FloatRect& r) { m_contentsRect = r; }
431
432     // Set a rounded rect that will be used to clip the layer contents.
433     FloatRoundedRect contentsClippingRect() const { return m_contentsClippingRect; }
434     virtual void setContentsClippingRect(const FloatRoundedRect& roundedRect) { m_contentsClippingRect = roundedRect; }
435
436     // Set a rounded rect that is used to clip this layer and its descendants (implies setting masksToBounds).
437     // Returns false if the platform can't support this rounded clip, and we should fall back to painting a mask.
438     FloatRoundedRect maskToBoundsRect() const { return m_masksToBoundsRect; };
439     virtual bool setMasksToBoundsRect(const FloatRoundedRect& roundedRect) { m_masksToBoundsRect = roundedRect; return false; }
440
441     Path shapeLayerPath() const;
442     virtual void setShapeLayerPath(const Path&);
443
444     WindRule shapeLayerWindRule() const;
445     virtual void setShapeLayerWindRule(WindRule);
446
447     // Transitions are identified by a special animation name that cannot clash with a keyframe identifier.
448     static String animationNameForTransition(AnimatedPropertyID);
449
450     // Return true if the animation is handled by the compositing system. If this returns
451     // false, the animation will be run by CSSAnimationController.
452     // These methods handle both transitions and keyframe animations.
453     virtual bool addAnimation(const KeyframeValueList&, const FloatSize& /*boxSize*/, const Animation*, const String& /*animationName*/, double /*timeOffset*/)  { return false; }
454     virtual void pauseAnimation(const String& /*animationName*/, double /*timeOffset*/) { }
455     virtual void removeAnimation(const String& /*animationName*/) { }
456
457     WEBCORE_EXPORT virtual void suspendAnimations(double time);
458     WEBCORE_EXPORT virtual void resumeAnimations();
459
460     // Layer contents
461     virtual void setContentsToImage(Image*) { }
462     virtual bool shouldDirectlyCompositeImage(Image*) const { return true; }
463 #if PLATFORM(IOS)
464     virtual PlatformLayer* contentsLayerForMedia() const { return 0; }
465 #endif
466     // Pass an invalid color to remove the contents layer.
467     virtual void setContentsToSolidColor(const Color&) { }
468     virtual void setContentsToPlatformLayer(PlatformLayer*, ContentsLayerPurpose) { }
469     virtual bool usesContentsLayer() const { return false; }
470
471     // Callback from the underlying graphics system to draw layer contents.
472     void paintGraphicsLayerContents(GraphicsContext&, const FloatRect& clip, GraphicsLayerPaintBehavior = GraphicsLayerPaintNormal);
473
474     // For hosting this GraphicsLayer in a native layer hierarchy.
475     virtual PlatformLayer* platformLayer() const { return 0; }
476
477     enum CompositingCoordinatesOrientation { CompositingCoordinatesTopDown, CompositingCoordinatesBottomUp };
478
479     // Flippedness of the contents of this layer. Does not affect sublayer geometry.
480     virtual void setContentsOrientation(CompositingCoordinatesOrientation orientation) { m_contentsOrientation = orientation; }
481     CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; }
482
483     void dumpLayer(WTF::TextStream&, int indent = 0, LayerTreeAsTextBehavior = LayerTreeAsTextBehaviorNormal) const;
484
485     virtual void setShowDebugBorder(bool show) { m_showDebugBorder = show; }
486     bool isShowingDebugBorder() const { return m_showDebugBorder; }
487
488     virtual void setShowRepaintCounter(bool show) { m_showRepaintCounter = show; }
489     bool isShowingRepaintCounter() const { return m_showRepaintCounter; }
490
491     // FIXME: this is really a paint count.
492     int repaintCount() const { return m_repaintCount; }
493     int incrementRepaintCount() { return ++m_repaintCount; }
494
495     virtual void setDebugBackgroundColor(const Color&) { }
496     virtual void setDebugBorder(const Color&, float /*borderWidth*/) { }
497
498     enum CustomAppearance { NoCustomAppearance, ScrollingOverhang, ScrollingShadow, LightBackdropAppearance, DarkBackdropAppearance };
499     virtual void setCustomAppearance(CustomAppearance customAppearance) { m_customAppearance = customAppearance; }
500     CustomAppearance customAppearance() const { return m_customAppearance; }
501
502     // z-position is the z-equivalent of position(). It's only used for debugging purposes.
503     virtual float zPosition() const { return m_zPosition; }
504     WEBCORE_EXPORT virtual void setZPosition(float);
505
506     WEBCORE_EXPORT virtual void distributeOpacity(float);
507     WEBCORE_EXPORT virtual float accumulatedOpacity() const;
508
509 #if PLATFORM(IOS)
510     bool hasFlattenedPerspectiveTransform() const { return !preserves3D() && m_childrenTransform.hasPerspective(); }
511 #endif
512     virtual FloatSize pixelAlignmentOffset() const { return FloatSize(); }
513     
514     virtual void setAppliesPageScale(bool appliesScale = true) { m_appliesPageScale = appliesScale; }
515     virtual bool appliesPageScale() const { return m_appliesPageScale; }
516
517     float pageScaleFactor() const { return m_client.pageScaleFactor(); }
518     float deviceScaleFactor() const { return m_client.deviceScaleFactor(); }
519     
520     // Whether this layer is viewport constrained, implying that it's moved around externally from GraphicsLayer (e.g. by the scrolling tree).
521     virtual void setIsViewportConstrained(bool) { }
522     virtual bool isViewportConstrained() const { return false; }
523
524     virtual void deviceOrPageScaleFactorChanged() { }
525     WEBCORE_EXPORT void noteDeviceOrPageScaleFactorChangedIncludingDescendants();
526
527     void setIsInWindow(bool);
528
529     // Some compositing systems may do internal batching to synchronize compositing updates
530     // with updates drawn into the window. These methods flush internal batched state on this layer
531     // and descendant layers, and this layer only.
532     virtual void flushCompositingState(const FloatRect& /* clipRect */) { }
533     virtual void flushCompositingStateForThisLayerOnly() { }
534
535     // If the exposed rect of this layer changes, returns true if this or descendant layers need a flush,
536     // for example to allocate new tiles.
537     virtual bool visibleRectChangeRequiresFlush(const FloatRect& /* clipRect */) const { return false; }
538
539     // Return a string with a human readable form of the layer tree, If debug is true
540     // pointers for the layers and timing data will be included in the returned string.
541     WEBCORE_EXPORT String layerTreeAsText(LayerTreeAsTextBehavior = LayerTreeAsTextBehaviorNormal) const;
542
543     // For testing.
544     WEBCORE_EXPORT virtual String displayListAsText(DisplayList::AsTextFlags) const { return String(); }
545
546     WEBCORE_EXPORT virtual void setIsTrackingDisplayListReplay(bool isTracking) { m_isTrackingDisplayListReplay = isTracking; }
547     WEBCORE_EXPORT virtual bool isTrackingDisplayListReplay() const { return m_isTrackingDisplayListReplay; }
548     WEBCORE_EXPORT virtual String replayDisplayListAsText(DisplayList::AsTextFlags) const { return String(); }
549
550     // Return an estimate of the backing store memory cost (in bytes). May be incorrect for tiled layers.
551     WEBCORE_EXPORT virtual double backingStoreMemoryEstimate() const;
552
553     virtual bool backingStoreAttached() const { return true; }
554
555     void setCanDetachBackingStore(bool b) { m_canDetachBackingStore = b; }
556     bool canDetachBackingStore() const { return m_canDetachBackingStore; }
557
558     virtual TiledBacking* tiledBacking() const { return 0; }
559
560     void resetTrackedRepaints();
561     void addRepaintRect(const FloatRect&);
562
563     static bool supportsBackgroundColorContent();
564     static bool supportsLayerType(Type);
565     static bool supportsContentsTiling();
566     static bool supportsSubpixelAntialiasedLayerText();
567
568     void updateDebugIndicators();
569
570     virtual bool canThrottleLayerFlush() const { return false; }
571
572     virtual bool isGraphicsLayerCA() const { return false; }
573     virtual bool isGraphicsLayerCARemote() const { return false; }
574     virtual bool isGraphicsLayerTextureMapper() const { return false; }
575     virtual bool isCoordinatedGraphicsLayer() const { return false; }
576
577     const std::optional<FloatRect>& animationExtent() const { return m_animationExtent; }
578     void setAnimationExtent(std::optional<FloatRect> animationExtent) { m_animationExtent = animationExtent; }
579
580     static void traverse(GraphicsLayer&, const WTF::Function<void (GraphicsLayer&)>&);
581
582 protected:
583     WEBCORE_EXPORT explicit GraphicsLayer(Type, GraphicsLayerClient&);
584
585     // Should be called from derived class destructors. Should call willBeDestroyed() on super.
586     WEBCORE_EXPORT virtual void willBeDestroyed();
587
588     // This method is used by platform GraphicsLayer classes to clear the filters
589     // when compositing is not done in hardware. It is not virtual, so the caller
590     // needs to notifiy the change to the platform layer as needed.
591     void clearFilters() { m_filters.clear(); }
592     void clearBackdropFilters() { m_backdropFilters.clear(); }
593
594     // Given a KeyframeValueList containing filterOperations, return true if the operations are valid.
595     static int validateFilterOperations(const KeyframeValueList&);
596
597     // Given a list of TransformAnimationValues, see if all the operations for each keyframe match. If so
598     // return the index of the KeyframeValueList entry that has that list of operations (it may not be
599     // the first entry because some keyframes might have an empty transform and those match any list).
600     // If the lists don't match return -1. On return, if hasBigRotation is true, functions contain 
601     // rotations of >= 180 degrees
602     static int validateTransformOperations(const KeyframeValueList&, bool& hasBigRotation);
603
604     virtual bool shouldRepaintOnSizeChange() const { return drawsContent(); }
605
606     virtual void setOpacityInternal(float) { }
607
608     // The layer being replicated.
609     GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; }
610     virtual void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; }
611
612     void dumpProperties(WTF::TextStream&, int indent, LayerTreeAsTextBehavior) const;
613     virtual void dumpAdditionalProperties(WTF::TextStream&, int /*indent*/, LayerTreeAsTextBehavior) const { }
614
615     WEBCORE_EXPORT virtual void getDebugBorderInfo(Color&, float& width) const;
616
617     GraphicsLayerClient& m_client;
618     String m_name;
619     
620     // Offset from the owning renderer
621     FloatSize m_offsetFromRenderer;
622     
623     // Position is relative to the parent GraphicsLayer
624     FloatPoint m_position;
625
626     // If set, overrides m_position. Only used for coverage computation.
627     std::optional<FloatPoint> m_approximatePosition;
628
629     FloatPoint3D m_anchorPoint;
630     FloatSize m_size;
631     FloatPoint m_boundsOrigin;
632
633     TransformationMatrix m_transform;
634     TransformationMatrix m_childrenTransform;
635
636     Color m_backgroundColor;
637     float m_opacity;
638     float m_zPosition;
639     
640     FilterOperations m_filters;
641     FilterOperations m_backdropFilters;
642
643 #if ENABLE(CSS_COMPOSITING)
644     BlendMode m_blendMode;
645 #endif
646
647     const Type m_type;
648
649     bool m_contentsOpaque : 1;
650     bool m_supportsSubpixelAntialiasedText : 1;
651     bool m_preserves3D: 1;
652     bool m_backfaceVisibility : 1;
653     bool m_masksToBounds : 1;
654     bool m_drawsContent : 1;
655     bool m_contentsVisible : 1;
656     bool m_acceleratesDrawing : 1;
657     bool m_usesDisplayListDrawing : 1;
658     bool m_appliesPageScale : 1; // Set for the layer which has the page scale applied to it.
659     bool m_showDebugBorder : 1;
660     bool m_showRepaintCounter : 1;
661     bool m_isMaskLayer : 1;
662     bool m_isTrackingDisplayListReplay : 1;
663     bool m_userInteractionEnabled : 1;
664     bool m_canDetachBackingStore : 1;
665     
666     GraphicsLayerPaintingPhase m_paintingPhase;
667     CompositingCoordinatesOrientation m_contentsOrientation; // affects orientation of layer contents
668
669     Vector<GraphicsLayer*> m_children;
670     GraphicsLayer* m_parent;
671
672     GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this.
673
674     GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We only allow one, for now.
675                                    // The replica is not parented; this is the primary reference to it.
676     GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer.
677     FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica.
678
679     FloatRect m_contentsRect;
680     FloatRoundedRect m_contentsClippingRect;
681     FloatRoundedRect m_masksToBoundsRect;
682     FloatSize m_contentsTilePhase;
683     FloatSize m_contentsTileSize;
684     FloatRoundedRect m_backdropFiltersRect;
685     std::optional<FloatRect> m_animationExtent;
686
687     int m_repaintCount;
688     CustomAppearance m_customAppearance;
689
690 #if USE(CA)
691     Path m_shapeLayerPath;
692     WindRule m_shapeLayerWindRule { RULE_NONZERO };
693 #endif
694 };
695
696 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, const Vector<GraphicsLayer::PlatformLayerID>&);
697 WEBCORE_EXPORT WTF::TextStream& operator<<(WTF::TextStream&, const GraphicsLayer::CustomAppearance&);
698
699 } // namespace WebCore
700
701 #define SPECIALIZE_TYPE_TRAITS_GRAPHICSLAYER(ToValueTypeName, predicate) \
702 SPECIALIZE_TYPE_TRAITS_BEGIN(ToValueTypeName) \
703     static bool isType(const WebCore::GraphicsLayer& layer) { return layer.predicate; } \
704 SPECIALIZE_TYPE_TRAITS_END()
705
706 #if ENABLE(TREE_DEBUGGING)
707 // Outside the WebCore namespace for ease of invocation from the debugger.
708 void showGraphicsLayerTree(const WebCore::GraphicsLayer* layer);
709 #endif