a21a0bb7b700ccd416decca0be2345f565134c2f
[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/HashMap.h>
38 #include <wtf/Noncopyable.h>
39 #include <wtf/RetainPtr.h>
40
41 namespace WebCore {
42
43 class FloatRect;
44 class IntPoint;
45 class IntRect;
46 class TileCoverageMap;
47 class TileGrid;
48
49 typedef Vector<RetainPtr<PlatformLayer>> PlatformLayerList;
50
51 const int kDefaultTileSize = 512;
52 // This is an experimental value for debugging and evaluating the overhead which may be
53 // incurred due to a large tile size.
54 const int kGiantTileSize = 4096;
55
56 class TileController final : public TiledBacking {
57     WTF_MAKE_NONCOPYABLE(TileController); WTF_MAKE_FAST_ALLOCATED;
58     friend class TileCoverageMap;
59     friend class TileGrid;
60 public:
61     WEBCORE_EXPORT explicit TileController(PlatformCALayer*);
62     ~TileController();
63     
64     WEBCORE_EXPORT static String tileGridContainerLayerName();
65     static String zoomedOutTileGridContainerLayerName();
66
67     WEBCORE_EXPORT void tileCacheLayerBoundsChanged();
68
69     WEBCORE_EXPORT void setNeedsDisplay();
70     WEBCORE_EXPORT void setNeedsDisplayInRect(const IntRect&);
71
72     WEBCORE_EXPORT void setContentsScale(float);
73     WEBCORE_EXPORT float contentsScale() const;
74
75     bool acceleratesDrawing() const { return m_acceleratesDrawing; }
76     WEBCORE_EXPORT void setAcceleratesDrawing(bool);
77
78     WEBCORE_EXPORT void setTilesOpaque(bool);
79     bool tilesAreOpaque() const { return m_tilesAreOpaque; }
80
81     PlatformCALayer& rootLayer() { return *m_tileCacheLayer; }
82     const PlatformCALayer& rootLayer() const { return *m_tileCacheLayer; }
83
84     WEBCORE_EXPORT void setTileDebugBorderWidth(float);
85     WEBCORE_EXPORT void setTileDebugBorderColor(Color);
86
87     FloatRect visibleRect() const override { return m_visibleRect; }
88     FloatRect coverageRect() const override { return m_coverageRect; }
89
90     unsigned blankPixelCount() const;
91     static unsigned blankPixelCountForTiles(const PlatformLayerList&, const FloatRect&, const IntPoint&);
92
93 #if PLATFORM(IOS)
94     unsigned numberOfUnparentedTiles() const;
95     void removeUnparentedTilesNow();
96 #endif
97
98     float deviceScaleFactor() const { return m_deviceScaleFactor; }
99
100     Color tileDebugBorderColor() const { return m_tileDebugBorderColor; }
101     float tileDebugBorderWidth() const { return m_tileDebugBorderWidth; }
102     ScrollingModeIndication indicatorMode() const { return m_indicatorMode; }
103
104     void willStartLiveResize() override;
105     void didEndLiveResize() override;
106
107     IntSize tileSize() const override;
108     IntRect bounds() const override;
109     IntRect boundsWithoutMargin() const override;
110     bool hasMargins() const override;
111     bool hasHorizontalMargins() const override;
112     bool hasVerticalMargins() const override;
113     int topMarginHeight() const override;
114     int bottomMarginHeight() const override;
115     int leftMarginWidth() const override;
116     int rightMarginWidth() const override;
117     TileCoverage tileCoverage() const override { return m_tileCoverage; }
118     void adjustTileCoverageRect(FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect, float contentsScale) const override;
119     bool unparentsOffscreenTiles() const override { return m_unparentsOffscreenTiles; }
120     bool scrollingPerformanceLoggingEnabled() const override { return m_scrollingPerformanceLoggingEnabled; }
121
122     IntRect boundsAtLastRevalidate() const { return m_boundsAtLastRevalidate; }
123     IntRect boundsAtLastRevalidateWithoutMargin() const;
124     void didRevalidateTiles();
125
126     bool shouldAggressivelyRetainTiles() const;
127     bool shouldTemporarilyRetainTileCohorts() const;
128
129     void updateTileCoverageMap();
130
131     RefPtr<PlatformCALayer> createTileLayer(const IntRect&, TileGrid&);
132
133     const TileGrid& tileGrid() const { return *m_tileGrid; }
134
135     WEBCORE_EXPORT Vector<RefPtr<PlatformCALayer>> containerLayers();
136
137 private:
138     TileGrid& tileGrid() { return *m_tileGrid; }
139
140     void scheduleTileRevalidation(double interval);
141
142     bool isInWindow() const { return m_isInWindow; }
143     float topContentInset() const { return m_topContentInset; }
144
145     // TiledBacking member functions.
146     void setVisibleRect(const FloatRect&) override;
147     void setCoverageRect(const FloatRect&) override;
148     bool tilesWouldChangeForCoverageRect(const FloatRect&) const override;
149     void setTiledScrollingIndicatorPosition(const FloatPoint&) override;
150     void setTopContentInset(float) override;
151     void setVelocity(const VelocityData&) override;
152     void setScrollability(Scrollability) override;
153     void prepopulateRect(const FloatRect&) override;
154     void setIsInWindow(bool) override;
155     void setTileCoverage(TileCoverage) override;
156     void revalidateTiles() override;
157     void forceRepaint() override;
158     IntRect tileGridExtent() const override;
159     void setScrollingPerformanceLoggingEnabled(bool flag) override { m_scrollingPerformanceLoggingEnabled = flag; }
160     void setUnparentsOffscreenTiles(bool flag) override { m_unparentsOffscreenTiles = flag; }
161     double retainedTileBackingStoreMemory() const override;
162     IntRect tileCoverageRect() const override;
163 #if USE(CA)
164     PlatformCALayer* tiledScrollingIndicatorLayer() override;
165 #endif
166     void setScrollingModeIndication(ScrollingModeIndication) override;
167     void setHasMargins(bool marginTop, bool marginBottom, bool marginLeft, bool marginRight) override;
168     void setMarginSize(int) override;
169     void setZoomedOutContentsScale(float) override;
170     float zoomedOutContentsScale() const override;
171
172     void updateMargins();
173     void clearZoomedOutTileGrid();
174     void tileGridsChanged();
175
176     void tileRevalidationTimerFired();
177     void setNeedsRevalidateTiles();
178
179     void notePendingTileSizeChange();
180     void tileSizeChangeTimerFired();
181     
182     IntRect boundsForSize(const FloatSize&) const;
183
184     PlatformCALayerClient* owningGraphicsLayer() const { return m_tileCacheLayer->owner(); }
185
186     PlatformCALayer* m_tileCacheLayer;
187
188     std::unique_ptr<TileCoverageMap> m_coverageMap;
189
190     std::unique_ptr<TileGrid> m_tileGrid;
191     std::unique_ptr<TileGrid> m_zoomedOutTileGrid;
192
193     FloatRect m_visibleRect; // Only used for scroll performance logging.
194     FloatRect m_coverageRect;
195     IntRect m_boundsAtLastRevalidate;
196
197     Timer m_tileRevalidationTimer;
198     DeferrableOneShotTimer m_tileSizeChangeTimer;
199
200     float m_zoomedOutContentsScale { 0 };
201     float m_deviceScaleFactor;
202
203     TileCoverage m_tileCoverage { CoverageForVisibleArea };
204     
205     VelocityData m_velocity;
206
207     int m_marginSize { kDefaultTileSize };
208
209     // m_marginTop and m_marginBottom are the height in pixels of the top and bottom margin tiles. The width
210     // of those tiles will be equivalent to the width of the other tiles in the grid. m_marginRight and
211     // m_marginLeft are the width in pixels of the right and left margin tiles, respectively. The height of
212     // those tiles will be equivalent to the height of the other tiles in the grid.
213     
214     Scrollability m_scrollability { HorizontallyScrollable | VerticallyScrollable };
215     
216     BoxExtent<bool> m_marginEdges;
217     
218     bool m_isInWindow { false };
219     bool m_scrollingPerformanceLoggingEnabled { false };
220     bool m_unparentsOffscreenTiles { false };
221     bool m_acceleratesDrawing { false };
222     bool m_tilesAreOpaque { false };
223     bool m_hasTilesWithTemporaryScaleFactor { false }; // Used to make low-res tiles when zooming.
224     bool m_inLiveResize { false };
225     mutable bool m_tileSizeLocked { false };
226
227     Color m_tileDebugBorderColor;
228     float m_tileDebugBorderWidth { 0 };
229     ScrollingModeIndication m_indicatorMode { SynchronousScrollingBecauseOfLackOfScrollingCoordinatorIndication };
230     float m_topContentInset { 0 };
231 };
232
233 } // namespace WebCore
234
235 #endif // TileController_h