[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / TileController.h
1 /*
2  * Copyright (C) 2011-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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef TileController_h
27 #define TileController_h
28
29 #include "FloatRect.h"
30 #include "IntRect.h"
31 #include "LengthBox.h"
32 #include "PlatformCALayer.h"
33 #include "PlatformCALayerClient.h"
34 #include "TiledBacking.h"
35 #include "Timer.h"
36 #include <wtf/Deque.h>
37 #include <wtf/Noncopyable.h>
38 #include <wtf/RetainPtr.h>
39
40 namespace WebCore {
41
42 class FloatRect;
43 class IntPoint;
44 class IntRect;
45 class TileCoverageMap;
46 class TileGrid;
47
48 typedef Vector<RetainPtr<PlatformLayer>> PlatformLayerList;
49
50 const int kDefaultTileSize = 512;
51
52 class TileController final : public TiledBacking {
53     WTF_MAKE_NONCOPYABLE(TileController); WTF_MAKE_FAST_ALLOCATED;
54     friend class TileCoverageMap;
55     friend class TileGrid;
56 public:
57     WEBCORE_EXPORT explicit TileController(PlatformCALayer*);
58     ~TileController();
59     
60     WEBCORE_EXPORT static String tileGridContainerLayerName();
61     static String zoomedOutTileGridContainerLayerName();
62
63     WEBCORE_EXPORT void tileCacheLayerBoundsChanged();
64
65     WEBCORE_EXPORT void setNeedsDisplay();
66     WEBCORE_EXPORT void setNeedsDisplayInRect(const IntRect&);
67
68     WEBCORE_EXPORT void setContentsScale(float);
69     WEBCORE_EXPORT float contentsScale() const;
70
71     bool acceleratesDrawing() const { return m_acceleratesDrawing; }
72     WEBCORE_EXPORT void setAcceleratesDrawing(bool);
73
74     WEBCORE_EXPORT void setTilesOpaque(bool);
75     bool tilesAreOpaque() const { return m_tilesAreOpaque; }
76
77     PlatformCALayer& rootLayer() { return *m_tileCacheLayer; }
78     const PlatformCALayer& rootLayer() const { return *m_tileCacheLayer; }
79
80     WEBCORE_EXPORT void setTileDebugBorderWidth(float);
81     WEBCORE_EXPORT void setTileDebugBorderColor(Color);
82
83     FloatRect visibleRect() const override { return m_visibleRect; }
84     FloatRect coverageRect() const override { return m_coverageRect; }
85     std::optional<FloatRect> layoutViewportRect() const { return m_layoutViewportRect; }
86
87     unsigned blankPixelCount() const;
88     static unsigned blankPixelCountForTiles(const PlatformLayerList&, const FloatRect&, const IntPoint&);
89
90 #if PLATFORM(IOS)
91     unsigned numberOfUnparentedTiles() const;
92     void removeUnparentedTilesNow();
93 #endif
94
95     float deviceScaleFactor() const { return m_deviceScaleFactor; }
96
97     const Color& tileDebugBorderColor() const { return m_tileDebugBorderColor; }
98     float tileDebugBorderWidth() const { return m_tileDebugBorderWidth; }
99     ScrollingModeIndication indicatorMode() const { return m_indicatorMode; }
100
101     void willStartLiveResize() override;
102     void didEndLiveResize() override;
103
104     IntSize tileSize() const override;
105     IntRect bounds() const override;
106     IntRect boundsWithoutMargin() const override;
107     bool hasMargins() const override;
108     bool hasHorizontalMargins() const override;
109     bool hasVerticalMargins() const override;
110     int topMarginHeight() const override;
111     int bottomMarginHeight() const override;
112     int leftMarginWidth() const override;
113     int rightMarginWidth() const override;
114     TileCoverage tileCoverage() const override { return m_tileCoverage; }
115     void adjustTileCoverageRect(FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect, float contentsScale) const override;
116     bool unparentsOffscreenTiles() const override { return m_unparentsOffscreenTiles; }
117     bool scrollingPerformanceLoggingEnabled() const override { return m_scrollingPerformanceLoggingEnabled; }
118
119     IntRect boundsAtLastRevalidate() const { return m_boundsAtLastRevalidate; }
120     IntRect boundsAtLastRevalidateWithoutMargin() const;
121     void didRevalidateTiles();
122
123     bool shouldAggressivelyRetainTiles() const;
124     bool shouldTemporarilyRetainTileCohorts() const;
125
126     void updateTileCoverageMap();
127
128     RefPtr<PlatformCALayer> createTileLayer(const IntRect&, TileGrid&);
129
130     const TileGrid& tileGrid() const { return *m_tileGrid; }
131
132     WEBCORE_EXPORT Vector<RefPtr<PlatformCALayer>> containerLayers();
133
134 private:
135     TileGrid& tileGrid() { return *m_tileGrid; }
136
137     void scheduleTileRevalidation(double interval);
138
139     bool isInWindow() const { return m_isInWindow; }
140     float topContentInset() const { return m_topContentInset; }
141
142     // TiledBacking member functions.
143     void setVisibleRect(const FloatRect&) override;
144     void setLayoutViewportRect(std::optional<FloatRect>) override;
145     void setCoverageRect(const FloatRect&) override;
146     bool tilesWouldChangeForCoverageRect(const FloatRect&) const override;
147     void setTiledScrollingIndicatorPosition(const FloatPoint&) override;
148     void setTopContentInset(float) override;
149     void setVelocity(const VelocityData&) override;
150     void setScrollability(Scrollability) override;
151     void prepopulateRect(const FloatRect&) override;
152     void setIsInWindow(bool) override;
153     void setTileCoverage(TileCoverage) override;
154     void revalidateTiles() override;
155     void forceRepaint() override;
156     IntRect tileGridExtent() const override;
157     void setScrollingPerformanceLoggingEnabled(bool flag) override { m_scrollingPerformanceLoggingEnabled = flag; }
158     void setUnparentsOffscreenTiles(bool flag) override { m_unparentsOffscreenTiles = flag; }
159     double retainedTileBackingStoreMemory() const override;
160     IntRect tileCoverageRect() const override;
161 #if USE(CA)
162     PlatformCALayer* tiledScrollingIndicatorLayer() override;
163 #endif
164     void setScrollingModeIndication(ScrollingModeIndication) override;
165     void setHasMargins(bool marginTop, bool marginBottom, bool marginLeft, bool marginRight) override;
166     void setMarginSize(int) override;
167     void setZoomedOutContentsScale(float) override;
168     float zoomedOutContentsScale() const override;
169
170     void updateMargins();
171     void clearZoomedOutTileGrid();
172     void tileGridsChanged();
173
174     void tileRevalidationTimerFired();
175     void setNeedsRevalidateTiles();
176
177     void notePendingTileSizeChange();
178     void tileSizeChangeTimerFired();
179     
180     IntRect boundsForSize(const FloatSize&) const;
181
182     PlatformCALayerClient* owningGraphicsLayer() const { return m_tileCacheLayer->owner(); }
183
184     PlatformCALayer* m_tileCacheLayer;
185
186     float m_zoomedOutContentsScale { 0 };
187     float m_deviceScaleFactor;
188
189     std::unique_ptr<TileCoverageMap> m_coverageMap;
190
191     std::unique_ptr<TileGrid> m_tileGrid;
192     std::unique_ptr<TileGrid> m_zoomedOutTileGrid;
193
194     FloatRect m_visibleRect; // Only used for scroll performance logging.
195     std::optional<FloatRect> m_layoutViewportRect; // Only used by the tiled scrolling indicator.
196     FloatRect m_coverageRect;
197     IntRect m_boundsAtLastRevalidate;
198
199     Timer m_tileRevalidationTimer;
200     DeferrableOneShotTimer m_tileSizeChangeTimer;
201
202     TileCoverage m_tileCoverage { CoverageForVisibleArea };
203     
204     VelocityData m_velocity;
205
206     int m_marginSize { kDefaultTileSize };
207
208     // m_marginTop and m_marginBottom are the height in pixels of the top and bottom margin tiles. The width
209     // of those tiles will be equivalent to the width of the other tiles in the grid. m_marginRight and
210     // m_marginLeft are the width in pixels of the right and left margin tiles, respectively. The height of
211     // those tiles will be equivalent to the height of the other tiles in the grid.
212     
213     Scrollability m_scrollability { HorizontallyScrollable | VerticallyScrollable };
214     
215     BoxExtent<bool> m_marginEdges;
216     
217     bool m_isInWindow { false };
218     bool m_scrollingPerformanceLoggingEnabled { false };
219     bool m_unparentsOffscreenTiles { false };
220     bool m_acceleratesDrawing { false };
221     bool m_tilesAreOpaque { false };
222     bool m_hasTilesWithTemporaryScaleFactor { false }; // Used to make low-res tiles when zooming.
223     bool m_inLiveResize { false };
224     mutable bool m_tileSizeLocked { false };
225
226     Color m_tileDebugBorderColor;
227     float m_tileDebugBorderWidth { 0 };
228     ScrollingModeIndication m_indicatorMode { SynchronousScrollingBecauseOfLackOfScrollingCoordinatorIndication };
229     float m_topContentInset { 0 };
230 };
231
232 } // namespace WebCore
233
234 #endif // TileController_h