Font antialiasing (smoothing) changes when elements are rendered into compositing...
[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     void setTileContentsFormatFlags(PlatformCALayer::ContentsFormatFlags) override;
82     PlatformCALayer::ContentsFormatFlags tileContentsFormatFlags() const { return m_contentsFormatFlags; }
83
84     PlatformCALayer& rootLayer() { return *m_tileCacheLayer; }
85     const PlatformCALayer& rootLayer() const { return *m_tileCacheLayer; }
86
87     WEBCORE_EXPORT void setTileDebugBorderWidth(float);
88     WEBCORE_EXPORT void setTileDebugBorderColor(Color);
89
90     FloatRect visibleRect() const override { return m_visibleRect; }
91     FloatRect coverageRect() const override { return m_coverageRect; }
92
93     unsigned blankPixelCount() const;
94     static unsigned blankPixelCountForTiles(const PlatformLayerList&, const FloatRect&, const IntPoint&);
95
96 #if PLATFORM(IOS)
97     unsigned numberOfUnparentedTiles() const;
98     void removeUnparentedTilesNow();
99 #endif
100
101     float deviceScaleFactor() const { return m_deviceScaleFactor; }
102
103     Color tileDebugBorderColor() const { return m_tileDebugBorderColor; }
104     float tileDebugBorderWidth() const { return m_tileDebugBorderWidth; }
105     ScrollingModeIndication indicatorMode() const { return m_indicatorMode; }
106
107     void willStartLiveResize() override;
108     void didEndLiveResize() override;
109
110     IntSize tileSize() const override;
111     IntRect bounds() const override;
112     IntRect boundsWithoutMargin() const override;
113     bool hasMargins() const override;
114     bool hasHorizontalMargins() const override;
115     bool hasVerticalMargins() const override;
116     int topMarginHeight() const override;
117     int bottomMarginHeight() const override;
118     int leftMarginWidth() const override;
119     int rightMarginWidth() const override;
120     TileCoverage tileCoverage() const override { return m_tileCoverage; }
121     void adjustTileCoverageRect(FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect, float contentsScale) const override;
122     bool unparentsOffscreenTiles() const override { return m_unparentsOffscreenTiles; }
123     bool scrollingPerformanceLoggingEnabled() const override { return m_scrollingPerformanceLoggingEnabled; }
124
125     IntRect boundsAtLastRevalidate() const { return m_boundsAtLastRevalidate; }
126     IntRect boundsAtLastRevalidateWithoutMargin() const;
127     void didRevalidateTiles();
128
129     bool shouldAggressivelyRetainTiles() const;
130     bool shouldTemporarilyRetainTileCohorts() const;
131
132     void updateTileCoverageMap();
133
134     RefPtr<PlatformCALayer> createTileLayer(const IntRect&, TileGrid&);
135
136     const TileGrid& tileGrid() const { return *m_tileGrid; }
137
138     WEBCORE_EXPORT Vector<RefPtr<PlatformCALayer>> containerLayers();
139
140 private:
141     TileGrid& tileGrid() { return *m_tileGrid; }
142
143     void scheduleTileRevalidation(double interval);
144
145     bool isInWindow() const { return m_isInWindow; }
146     float topContentInset() const { return m_topContentInset; }
147
148     // TiledBacking member functions.
149     void setVisibleRect(const FloatRect&) override;
150     void setCoverageRect(const FloatRect&) override;
151     bool tilesWouldChangeForCoverageRect(const FloatRect&) const override;
152     void setTiledScrollingIndicatorPosition(const FloatPoint&) override;
153     void setTopContentInset(float) override;
154     void setVelocity(const VelocityData&) override;
155     void setScrollability(Scrollability) override;
156     void prepopulateRect(const FloatRect&) override;
157     void setIsInWindow(bool) override;
158     void setTileCoverage(TileCoverage) override;
159     void revalidateTiles() override;
160     void forceRepaint() override;
161     IntRect tileGridExtent() const override;
162     void setScrollingPerformanceLoggingEnabled(bool flag) override { m_scrollingPerformanceLoggingEnabled = flag; }
163     void setUnparentsOffscreenTiles(bool flag) override { m_unparentsOffscreenTiles = flag; }
164     double retainedTileBackingStoreMemory() const override;
165     IntRect tileCoverageRect() const override;
166 #if USE(CA)
167     PlatformCALayer* tiledScrollingIndicatorLayer() override;
168 #endif
169     void setScrollingModeIndication(ScrollingModeIndication) override;
170     void setHasMargins(bool marginTop, bool marginBottom, bool marginLeft, bool marginRight) override;
171     void setMarginSize(int) override;
172     void setZoomedOutContentsScale(float) override;
173     float zoomedOutContentsScale() const override;
174
175     void updateMargins();
176     void clearZoomedOutTileGrid();
177     void tileGridsChanged();
178
179     void tileRevalidationTimerFired();
180     void setNeedsRevalidateTiles();
181
182     void notePendingTileSizeChange();
183     void tileSizeChangeTimerFired();
184     
185     IntRect boundsForSize(const FloatSize&) const;
186
187     PlatformCALayerClient* owningGraphicsLayer() const { return m_tileCacheLayer->owner(); }
188
189     PlatformCALayer* m_tileCacheLayer;
190
191     std::unique_ptr<TileCoverageMap> m_coverageMap;
192
193     std::unique_ptr<TileGrid> m_tileGrid;
194     std::unique_ptr<TileGrid> m_zoomedOutTileGrid;
195
196     FloatRect m_visibleRect; // Only used for scroll performance logging.
197     FloatRect m_coverageRect;
198     IntRect m_boundsAtLastRevalidate;
199
200     Timer m_tileRevalidationTimer;
201     DeferrableOneShotTimer m_tileSizeChangeTimer;
202
203     float m_zoomedOutContentsScale { 0 };
204     float m_deviceScaleFactor;
205
206     TileCoverage m_tileCoverage { CoverageForVisibleArea };
207     
208     VelocityData m_velocity;
209
210     int m_marginSize { kDefaultTileSize };
211
212     PlatformCALayer::ContentsFormatFlags m_contentsFormatFlags { 0 };
213
214     // m_marginTop and m_marginBottom are the height in pixels of the top and bottom margin tiles. The width
215     // of those tiles will be equivalent to the width of the other tiles in the grid. m_marginRight and
216     // m_marginLeft are the width in pixels of the right and left margin tiles, respectively. The height of
217     // those tiles will be equivalent to the height of the other tiles in the grid.
218     
219     Scrollability m_scrollability { HorizontallyScrollable | VerticallyScrollable };
220     
221     BoxExtent<bool> m_marginEdges;
222     
223     bool m_isInWindow { false };
224     bool m_scrollingPerformanceLoggingEnabled { false };
225     bool m_unparentsOffscreenTiles { false };
226     bool m_acceleratesDrawing { false };
227     bool m_tilesAreOpaque { false };
228     bool m_hasTilesWithTemporaryScaleFactor { false }; // Used to make low-res tiles when zooming.
229     bool m_inLiveResize { false };
230     mutable bool m_tileSizeLocked { false };
231
232     Color m_tileDebugBorderColor;
233     float m_tileDebugBorderWidth { 0 };
234     ScrollingModeIndication m_indicatorMode { SynchronousScrollingBecauseOfLackOfScrollingCoordinatorIndication };
235     float m_topContentInset { 0 };
236 };
237
238 } // namespace WebCore
239
240 #endif // TileController_h