Add a way to update GraphicsLayerCA visibleRects without having to do a flush
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / mac / TileController.h
1 /*
2  * Copyright (C) 2011, 2012, 2013 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 "IntPointHash.h"
31 #include "IntRect.h"
32 #include "TiledBacking.h"
33 #include "Timer.h"
34 #include <wtf/Deque.h>
35 #include <wtf/HashMap.h>
36 #include <wtf/Noncopyable.h>
37 #include <wtf/PassOwnPtr.h>
38 #include <wtf/RetainPtr.h>
39
40 OBJC_CLASS CALayer;
41 OBJC_CLASS WebTiledBackingLayer;
42 OBJC_CLASS WebTileLayer;
43 OBJC_CLASS WebTiledScrollingIndicatorLayer;
44
45 namespace WebCore {
46
47 class FloatRect;
48 class IntPoint;
49 class IntRect;
50
51 typedef Vector<RetainPtr<WebTileLayer> > WebTileLayerList;
52
53 class TileController : public TiledBacking {
54     WTF_MAKE_NONCOPYABLE(TileController);
55
56 public:
57     static PassOwnPtr<TileController> create(WebTiledBackingLayer*);
58     ~TileController();
59
60     void tileCacheLayerBoundsChanged();
61
62     void setNeedsDisplay();
63     void setNeedsDisplayInRect(const IntRect&);
64     void drawLayer(WebTileLayer *, CGContextRef);
65
66     void setScale(CGFloat);
67     CGFloat scale() const { return m_scale; }
68
69     bool acceleratesDrawing() const { return m_acceleratesDrawing; }
70     void setAcceleratesDrawing(bool);
71
72     void setTilesOpaque(bool);
73     bool tilesAreOpaque() const { return m_tilesAreOpaque; }
74
75     CALayer *tileContainerLayer() const { return m_tileContainerLayer.get(); }
76
77     void setTileDebugBorderWidth(float);
78     void setTileDebugBorderColor(CGColorRef);
79
80     virtual FloatRect visibleRect() const OVERRIDE { return m_visibleRect; }
81
82     unsigned blankPixelCount() const;
83     static unsigned blankPixelCountForTiles(const WebTileLayerList&, const FloatRect&, const IntPoint&);
84
85     // Only public for the WebTileCacheMapLayer.
86     void drawTileMapContents(CGContextRef, CGRect);
87
88 public:
89     // Only public for inline methods in the implementation file.
90     typedef IntPoint TileIndex;
91     typedef unsigned TileCohort;
92     static const TileCohort VisibleTileCohort = UINT_MAX;
93
94     struct TileInfo {
95         RetainPtr<WebTileLayer> layer;
96         TileCohort cohort; // VisibleTileCohort is visible.
97         bool hasStaleContent;
98         
99         TileInfo()
100             : cohort(VisibleTileCohort)
101             , hasStaleContent(false)
102         { }
103     };
104
105 private:
106     TileController(WebTiledBackingLayer*);
107
108     // TiledBacking member functions.
109     virtual void setVisibleRect(const FloatRect&) OVERRIDE;
110     virtual bool tilesWouldChangeForVisibleRect(const FloatRect&) const OVERRIDE;
111     virtual void setExposedRect(const FloatRect&) OVERRIDE;
112     virtual bool clipsToExposedRect() OVERRIDE { return m_clipsToExposedRect; }
113     virtual void setClipsToExposedRect(bool) OVERRIDE;
114     virtual void prepopulateRect(const FloatRect&) OVERRIDE;
115     virtual void setIsInWindow(bool) OVERRIDE;
116     virtual void setTileCoverage(TileCoverage) OVERRIDE;
117     virtual TileCoverage tileCoverage() const OVERRIDE { return m_tileCoverage; }
118     virtual void forceRepaint() OVERRIDE;
119     virtual IntSize tileSize() const OVERRIDE { return m_tileSize; }
120     virtual IntRect tileGridExtent() const OVERRIDE;
121     virtual void setScrollingPerformanceLoggingEnabled(bool flag) OVERRIDE { m_scrollingPerformanceLoggingEnabled = flag; }
122     virtual bool scrollingPerformanceLoggingEnabled() const OVERRIDE { return m_scrollingPerformanceLoggingEnabled; }
123     virtual void setAggressivelyRetainsTiles(bool flag) OVERRIDE { m_aggressivelyRetainsTiles = flag; }
124     virtual bool aggressivelyRetainsTiles() const OVERRIDE { return m_aggressivelyRetainsTiles; }
125     virtual void setUnparentsOffscreenTiles(bool flag) OVERRIDE { m_unparentsOffscreenTiles = flag; }
126     virtual bool unparentsOffscreenTiles() const OVERRIDE { return m_unparentsOffscreenTiles; }
127     virtual double retainedTileBackingStoreMemory() const OVERRIDE;
128     virtual IntRect tileCoverageRect() const OVERRIDE;
129     virtual CALayer *tiledScrollingIndicatorLayer() OVERRIDE;
130     virtual void setScrollingModeIndication(ScrollingModeIndication) OVERRIDE;
131
132     IntRect bounds() const;
133
134     IntRect rectForTileIndex(const TileIndex&) const;
135     void getTileIndexRangeForRect(const IntRect&, TileIndex& topLeft, TileIndex& bottomRight) const;
136
137     FloatRect computeTileCoverageRect(const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect) const;
138     IntSize tileSizeForCoverageRect(const FloatRect&) const;
139
140     void scheduleTileRevalidation(double interval);
141     void tileRevalidationTimerFired(Timer<TileController>*);
142
143     void scheduleCohortRemoval();
144     void cohortRemovalTimerFired(Timer<TileController>*);
145     
146     typedef unsigned TileValidationPolicyFlags;
147
148     void revalidateTiles(TileValidationPolicyFlags foregroundValidationPolicy = 0, TileValidationPolicyFlags backgroundValidationPolicy = 0);
149     void ensureTilesForRect(const FloatRect&);
150     void updateTileCoverageMap();
151
152     void removeAllTiles();
153     void removeAllSecondaryTiles();
154     void removeTilesInCohort(TileCohort);
155
156     TileCohort nextTileCohort() const;
157     void startedNewCohort(TileCohort);
158     
159     TileCohort newestTileCohort() const;
160     TileCohort oldestTileCohort() const;
161
162     void setTileNeedsDisplayInRect(const TileIndex&, TileInfo&, const IntRect& repaintRectInTileCoords, const IntRect& coverageRectInTileCoords);
163
164     WebTileLayer* tileLayerAtIndex(const TileIndex&) const;
165     RetainPtr<WebTileLayer> createTileLayer(const IntRect&);
166
167     bool shouldShowRepaintCounters() const;
168     void drawRepaintCounter(WebTileLayer *, CGContextRef);
169
170     WebTiledBackingLayer* m_tileCacheLayer;
171     RetainPtr<CALayer> m_tileContainerLayer;
172     RetainPtr<WebTiledScrollingIndicatorLayer> m_tiledScrollingIndicatorLayer; // Used for coverage visualization.
173
174     IntSize m_tileSize;
175     FloatRect m_visibleRect;
176     FloatRect m_visibleRectAtLastRevalidate;
177     FloatRect m_exposedRect; // The exposed area of containing platform views.
178
179     typedef HashMap<TileIndex, TileInfo> TileMap;
180     TileMap m_tiles;
181     Timer<TileController> m_tileRevalidationTimer;
182     Timer<TileController> m_cohortRemovalTimer;
183
184     struct TileCohortInfo {
185         TileCohort cohort;
186         double creationTime; // in monotonicallyIncreasingTime().
187         TileCohortInfo(TileCohort inCohort, double inTime)
188             : cohort(inCohort)
189             , creationTime(inTime)
190         { }
191     };
192     typedef Deque<TileCohortInfo> TileCohortList;
193     TileCohortList m_cohortList;
194     
195     IntRect m_primaryTileCoverageRect; // In tile coords.
196
197     CGFloat m_scale;
198     CGFloat m_deviceScaleFactor;
199
200     TileCoverage m_tileCoverage;
201     bool m_isInWindow;
202     bool m_scrollingPerformanceLoggingEnabled;
203     bool m_aggressivelyRetainsTiles;
204     bool m_unparentsOffscreenTiles;
205     bool m_acceleratesDrawing;
206     bool m_tilesAreOpaque;
207     bool m_clipsToExposedRect;
208
209     RetainPtr<CGColorRef> m_tileDebugBorderColor;
210     float m_tileDebugBorderWidth;
211     ScrollingModeIndication m_indicatorMode;
212 };
213
214 } // namespace WebCore
215
216 #endif // TileController_h