3c83dcf97df392fada8c51e07c05c87c9bb15b2e
[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 void setExposedRect(const FloatRect&) OVERRIDE;
111     virtual bool clipsToExposedRect() OVERRIDE { return m_clipsToExposedRect; }
112     virtual void setClipsToExposedRect(bool) OVERRIDE;
113     virtual void prepopulateRect(const FloatRect&) OVERRIDE;
114     virtual void setIsInWindow(bool) OVERRIDE;
115     virtual void setTileCoverage(TileCoverage) OVERRIDE;
116     virtual TileCoverage tileCoverage() const OVERRIDE { return m_tileCoverage; }
117     virtual void forceRepaint() OVERRIDE;
118     virtual IntSize tileSize() const OVERRIDE { return m_tileSize; }
119     virtual IntRect tileGridExtent() const OVERRIDE;
120     virtual void setScrollingPerformanceLoggingEnabled(bool flag) OVERRIDE { m_scrollingPerformanceLoggingEnabled = flag; }
121     virtual bool scrollingPerformanceLoggingEnabled() const OVERRIDE { return m_scrollingPerformanceLoggingEnabled; }
122     virtual void setAggressivelyRetainsTiles(bool flag) OVERRIDE { m_aggressivelyRetainsTiles = flag; }
123     virtual bool aggressivelyRetainsTiles() const OVERRIDE { return m_aggressivelyRetainsTiles; }
124     virtual void setUnparentsOffscreenTiles(bool flag) OVERRIDE { m_unparentsOffscreenTiles = flag; }
125     virtual bool unparentsOffscreenTiles() const OVERRIDE { return m_unparentsOffscreenTiles; }
126     virtual IntRect tileCoverageRect() const OVERRIDE;
127     virtual CALayer *tiledScrollingIndicatorLayer() OVERRIDE;
128     virtual void setScrollingModeIndication(ScrollingModeIndication) OVERRIDE;
129
130     IntRect bounds() const;
131
132     IntRect rectForTileIndex(const TileIndex&) const;
133     void getTileIndexRangeForRect(const IntRect&, TileIndex& topLeft, TileIndex& bottomRight) const;
134
135     FloatRect computeTileCoverageRect(const FloatRect& previousVisibleRect) const;
136     IntSize tileSizeForCoverageRect(const FloatRect&) const;
137
138     void scheduleTileRevalidation(double interval);
139     void tileRevalidationTimerFired(Timer<TileController>*);
140
141     void scheduleCohortRemoval();
142     void cohortRemovalTimerFired(Timer<TileController>*);
143     
144     typedef unsigned TileValidationPolicyFlags;
145
146     void revalidateTiles(TileValidationPolicyFlags foregroundValidationPolicy = 0, TileValidationPolicyFlags backgroundValidationPolicy = 0);
147     void ensureTilesForRect(const FloatRect&);
148     void updateTileCoverageMap();
149
150     void removeAllTiles();
151     void removeAllSecondaryTiles();
152     void removeTilesInCohort(TileCohort);
153
154     TileCohort nextTileCohort() const;
155     void startedNewCohort(TileCohort);
156     
157     TileCohort newestTileCohort() const;
158     TileCohort oldestTileCohort() const;
159
160     void setTileNeedsDisplayInRect(const TileIndex&, TileInfo&, const IntRect& repaintRectInTileCoords, const IntRect& coverageRectInTileCoords);
161
162     WebTileLayer* tileLayerAtIndex(const TileIndex&) const;
163     RetainPtr<WebTileLayer> createTileLayer(const IntRect&);
164
165     bool shouldShowRepaintCounters() const;
166     void drawRepaintCounter(WebTileLayer *, CGContextRef);
167
168     WebTiledBackingLayer* m_tileCacheLayer;
169     RetainPtr<CALayer> m_tileContainerLayer;
170     RetainPtr<WebTiledScrollingIndicatorLayer> m_tiledScrollingIndicatorLayer; // Used for coverage visualization.
171
172     IntSize m_tileSize;
173     FloatRect m_visibleRect;
174     FloatRect m_visibleRectAtLastRevalidate;
175     FloatRect m_exposedRect; // The exposed area of containing platform views.
176
177     typedef HashMap<TileIndex, TileInfo> TileMap;
178     TileMap m_tiles;
179     Timer<TileController> m_tileRevalidationTimer;
180     Timer<TileController> m_cohortRemovalTimer;
181
182     struct TileCohortInfo {
183         TileCohort cohort;
184         double creationTime; // in monotonicallyIncreasingTime().
185         TileCohortInfo(TileCohort inCohort, double inTime)
186             : cohort(inCohort)
187             , creationTime(inTime)
188         { }
189     };
190     typedef Deque<TileCohortInfo> TileCohortList;
191     TileCohortList m_cohortList;
192     
193     IntRect m_primaryTileCoverageRect; // In tile coords.
194
195     CGFloat m_scale;
196     CGFloat m_deviceScaleFactor;
197
198     TileCoverage m_tileCoverage;
199     bool m_isInWindow;
200     bool m_scrollingPerformanceLoggingEnabled;
201     bool m_aggressivelyRetainsTiles;
202     bool m_unparentsOffscreenTiles;
203     bool m_acceleratesDrawing;
204     bool m_tilesAreOpaque;
205     bool m_clipsToExposedRect;
206
207     RetainPtr<CGColorRef> m_tileDebugBorderColor;
208     float m_tileDebugBorderWidth;
209     ScrollingModeIndication m_indicatorMode;
210 };
211
212 } // namespace WebCore
213
214 #endif // TileController_h