Tiled scrolling indicator needs to take topContentInset into account
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / mac / 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 "PlatformCALayer.h"
32 #include "PlatformCALayerClient.h"
33 #include "TiledBacking.h"
34 #include "Timer.h"
35 #include <wtf/Deque.h>
36 #include <wtf/HashMap.h>
37 #include <wtf/Noncopyable.h>
38 #include <wtf/PassOwnPtr.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 class TileController final : public TiledBacking {
52     WTF_MAKE_NONCOPYABLE(TileController); WTF_MAKE_FAST_ALLOCATED;
53 public:
54     static PassOwnPtr<TileController> create(PlatformCALayer*);
55     ~TileController();
56
57     void tileCacheLayerBoundsChanged();
58
59     void setNeedsDisplay();
60     void setNeedsDisplayInRect(const IntRect&);
61
62     void setContentsScale(float);
63     float contentsScale() const;
64
65     bool acceleratesDrawing() const { return m_acceleratesDrawing; }
66     void setAcceleratesDrawing(bool);
67
68     void setTilesOpaque(bool);
69     bool tilesAreOpaque() const { return m_tilesAreOpaque; }
70
71     PlatformCALayer& rootLayer() { return *m_tileCacheLayer; }
72     const PlatformCALayer& rootLayer() const { return *m_tileCacheLayer; }
73
74     void setTileDebugBorderWidth(float);
75     void setTileDebugBorderColor(Color);
76
77     virtual FloatRect visibleRect() const override { return m_visibleRect; }
78
79     unsigned blankPixelCount() const;
80     static unsigned blankPixelCountForTiles(const PlatformLayerList&, const FloatRect&, const IntPoint&);
81
82 #if PLATFORM(IOS)
83     unsigned numberOfUnparentedTiles() const;
84     void removeUnparentedTilesNow();
85 #endif
86
87 public:
88     // Public for TileGrid and TileCoverageMap
89     bool isInWindow() const { return m_isInWindow; }
90
91     float deviceScaleFactor() const { return m_deviceScaleFactor; }
92
93     Color tileDebugBorderColor() const { return m_tileDebugBorderColor; }
94     float tileDebugBorderWidth() const { return m_tileDebugBorderWidth; }
95     ScrollingModeIndication indicatorMode() const { return m_indicatorMode; }
96
97     virtual IntSize tileSize() const override { return m_tileSize; }
98     virtual IntRect bounds() const override;
99     virtual bool hasMargins() const override;
100     virtual bool hasHorizontalMargins() const override;
101     virtual bool hasVerticalMargins() const override;
102     virtual int topMarginHeight() const override;
103     virtual int bottomMarginHeight() const override;
104     virtual int leftMarginWidth() const override;
105     virtual int rightMarginWidth() const override;
106     virtual TileCoverage tileCoverage() const override { return m_tileCoverage; }
107     virtual bool unparentsOffscreenTiles() const override { return m_unparentsOffscreenTiles; }
108     virtual bool scrollingPerformanceLoggingEnabled() const override { return m_scrollingPerformanceLoggingEnabled; }
109
110     IntRect boundsWithoutMargin() const;
111
112     FloatRect computeTileCoverageRect(const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect) const;
113
114     IntRect boundsAtLastRevalidate() const { return m_boundsAtLastRevalidate; }
115     IntRect boundsAtLastRevalidateWithoutMargin() const;
116     FloatRect visibleRectAtLastRevalidate() const { return m_visibleRectAtLastRevalidate; }
117     void didRevalidateTiles();
118
119     bool shouldAggressivelyRetainTiles() const;
120     bool shouldTemporarilyRetainTileCohorts() const;
121
122     void updateTileCoverageMap();
123
124     RefPtr<PlatformCALayer> createTileLayer(const IntRect&, TileGrid&);
125
126     const TileGrid& tileGrid() const { return *m_tileGrid; }
127
128     Vector<RefPtr<PlatformCALayer>> containerLayers();
129
130     float topContentInset() const { return m_topContentInset; }
131
132 private:
133     TileController(PlatformCALayer*);
134
135     TileGrid& tileGrid() { return *m_tileGrid; }
136
137     // TiledBacking member functions.
138     virtual void setVisibleRect(const FloatRect&) override;
139     virtual bool tilesWouldChangeForVisibleRect(const FloatRect&) const override;
140     virtual void setTiledScrollingIndicatorPosition(const FloatPoint&) override;
141     virtual void setTopContentInset(float) override;
142     virtual void prepopulateRect(const FloatRect&) override;
143     virtual void setIsInWindow(bool) override;
144     virtual void setTileCoverage(TileCoverage) override;
145     virtual void revalidateTiles() override;
146     virtual void forceRepaint() override;
147     virtual IntRect tileGridExtent() const override;
148     virtual void setScrollingPerformanceLoggingEnabled(bool flag) override { m_scrollingPerformanceLoggingEnabled = flag; }
149     virtual void setUnparentsOffscreenTiles(bool flag) override { m_unparentsOffscreenTiles = flag; }
150     virtual double retainedTileBackingStoreMemory() const override;
151     virtual IntRect tileCoverageRect() const override;
152     virtual PlatformCALayer* tiledScrollingIndicatorLayer() override;
153     virtual void setScrollingModeIndication(ScrollingModeIndication) override;
154     virtual void setTileMargins(int marginTop, int marginBottom, int marginLeft, int marginRight) override;
155     virtual void setZoomedOutContentsScale(float) override;
156     virtual float zoomedOutContentsScale() const override;
157
158     void scheduleTileRevalidation(double interval);
159     void tileRevalidationTimerFired(Timer<TileController>*);
160
161     void setNeedsRevalidateTiles();
162
163     PlatformCALayerClient* owningGraphicsLayer() const { return m_tileCacheLayer->owner(); }
164
165     PlatformCALayer* m_tileCacheLayer;
166
167     std::unique_ptr<TileCoverageMap> m_coverageMap;
168
169     std::unique_ptr<TileGrid> m_tileGrid;
170     std::unique_ptr<TileGrid> m_zoomedOutTileGrid;
171
172     IntSize m_tileSize;
173     FloatRect m_visibleRect;
174     FloatRect m_visibleRectAtLastRevalidate;
175     IntRect m_boundsAtLastRevalidate;
176
177     Timer<TileController> m_tileRevalidationTimer;
178
179     float m_zoomedOutContentsScale;
180     float m_deviceScaleFactor;
181
182     TileCoverage m_tileCoverage;
183
184     // m_marginTop and m_marginBottom are the height in pixels of the top and bottom margin tiles. The width
185     // of those tiles will be equivalent to the width of the other tiles in the grid. m_marginRight and
186     // m_marginLeft are the width in pixels of the right and left margin tiles, respectively. The height of
187     // those tiles will be equivalent to the height of the other tiles in the grid.
188     int m_marginTop;
189     int m_marginBottom;
190     int m_marginLeft;
191     int m_marginRight;
192
193     bool m_isInWindow;
194     bool m_scrollingPerformanceLoggingEnabled;
195     bool m_unparentsOffscreenTiles;
196     bool m_acceleratesDrawing;
197     bool m_tilesAreOpaque;
198     bool m_hasTilesWithTemporaryScaleFactor; // Used to make low-res tiles when zooming.
199
200     Color m_tileDebugBorderColor;
201     float m_tileDebugBorderWidth;
202     ScrollingModeIndication m_indicatorMode;
203     float m_topContentInset;
204 };
205
206 } // namespace WebCore
207
208 #endif // TileController_h