Unreviewed, roll out http://trac.webkit.org/changeset/187972.
[WebKit-https.git] / Source / WebCore / platform / ios / LegacyTileCache.h
1 /*
2  * Copyright (C) 2009, 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 LegacyTileCache_h
27 #define LegacyTileCache_h
28
29 #if PLATFORM(IOS)
30
31 #include "Color.h"
32 #include "FloatRect.h"
33 #include "IntRect.h"
34 #include "IntSize.h"
35 #include "Timer.h"
36 #include <wtf/Noncopyable.h>
37 #include <wtf/Optional.h>
38 #include <wtf/PassRefPtr.h>
39 #include <wtf/RetainPtr.h>
40 #include <wtf/Threading.h>
41 #include <wtf/Vector.h>
42
43 #ifdef __OBJC__
44 @class CALayer;
45 @class LegacyTileCacheTombstone;
46 @class LegacyTileLayer;
47 @class WAKWindow;
48 #else
49 class CALayer;
50 class LegacyTileCacheTombstone;
51 class LegacyTileLayer;
52 class WAKWindow;
53 #endif
54
55 namespace WebCore {
56
57 class LegacyTileGrid;
58
59 class LegacyTileCache {
60     WTF_MAKE_NONCOPYABLE(LegacyTileCache);
61 public:
62     LegacyTileCache(WAKWindow*);
63     ~LegacyTileCache();
64
65     CGFloat screenScale() const;
66
67     void setNeedsDisplay();
68     void setNeedsDisplayInRect(const IntRect&);
69     
70     void layoutTiles();
71     void layoutTilesNow();
72     void layoutTilesNowForRect(const IntRect&);
73     void removeAllNonVisibleTiles();
74     void removeAllTiles();
75     void removeForegroundTiles();
76
77     // If 'contentReplacementImage' is not NULL, drawLayer() draws
78     // contentReplacementImage instead of the page content. We assume the
79     // image is to be drawn at the origin and scaled to match device pixels.
80     void setContentReplacementImage(RetainPtr<CGImageRef>);
81     RetainPtr<CGImageRef> contentReplacementImage() const;
82
83     void setTileBordersVisible(bool);
84     bool tileBordersVisible() const { return m_tileBordersVisible; }
85
86     void setTilePaintCountersVisible(bool);
87     bool tilePaintCountersVisible() const { return m_tilePaintCountersVisible; }
88
89     void setAcceleratedDrawingEnabled(bool enabled) { m_acceleratedDrawingEnabled = enabled; }
90     bool acceleratedDrawingEnabled() const { return m_acceleratedDrawingEnabled; }
91
92     void setKeepsZoomedOutTiles(bool);
93     bool keepsZoomedOutTiles() const { return m_keepsZoomedOutTiles; }
94
95     void setZoomedOutScale(float);
96     float zoomedOutScale() const;
97     
98     void setCurrentScale(float);
99     float currentScale() const;
100     
101     bool tilesOpaque() const;
102     void setTilesOpaque(bool);
103     
104     enum TilingMode {
105         Normal,
106         Minimal,
107         Panning,
108         Zooming,
109         Disabled,
110         ScrollToTop
111     };
112     TilingMode tilingMode() const { return m_tilingMode; }
113     void setTilingMode(TilingMode);
114
115     typedef enum {
116         TilingDirectionUp,
117         TilingDirectionDown,
118         TilingDirectionLeft,
119         TilingDirectionRight,
120     } TilingDirection;
121     void setTilingDirection(TilingDirection);
122     TilingDirection tilingDirection() const;
123
124     bool hasPendingDraw() const;
125
126     void hostLayerSizeChanged();
127
128     WEBCORE_EXPORT static void setLayerPoolCapacity(unsigned);
129     WEBCORE_EXPORT static void drainLayerPool();
130
131     // Logging
132     void dumpTiles();
133
134     // Internal
135     void doLayoutTiles();
136     void drawLayer(LegacyTileLayer*, CGContextRef);
137     void prepareToDraw();
138     void finishedCreatingTiles(bool didCreateTiles, bool createMore);
139     FloatRect visibleRectInLayer(CALayer *) const;
140     CALayer* hostLayer() const;
141     unsigned tileCapacityForGrid(LegacyTileGrid*);
142     Color colorForGridTileBorder(LegacyTileGrid*) const;
143     void setOverrideVisibleRect(Optional<FloatRect>);
144
145     void doPendingRepaints();
146
147     bool isSpeculativeTileCreationEnabled() const { return m_isSpeculativeTileCreationEnabled; }
148     void setSpeculativeTileCreationEnabled(bool);
149     
150     enum SynchronousTileCreationMode { CoverVisibleOnly, CoverSpeculative };
151
152     bool tileControllerShouldUseLowScaleTiles() const { return m_tileControllerShouldUseLowScaleTiles; } 
153     void setTileControllerShouldUseLowScaleTiles(bool flag) { m_tileControllerShouldUseLowScaleTiles = flag; } 
154
155 private:
156     LegacyTileGrid* activeTileGrid() const;
157     LegacyTileGrid* inactiveTileGrid() const;
158
159     void updateTilingMode();
160     bool isTileInvalidationSuspended() const;
161     bool isTileCreationSuspended() const;
162     void flushSavedDisplayRects();
163     void invalidateTiles(const IntRect& dirtyRect);
164     void setZoomedOutScaleInternal(float);
165     void commitScaleChange();
166     void bringActiveTileGridToFront();
167     void adjustTileGridTransforms();
168     void removeAllNonVisibleTilesInternal();
169     void createTilesInActiveGrid(SynchronousTileCreationMode);
170     void scheduleLayerFlushForPendingRepaint();
171
172     void tileCreationTimerFired();
173
174     void drawReplacementImage(LegacyTileLayer*, CGContextRef, CGImageRef);
175     void drawWindowContent(LegacyTileLayer*, CGContextRef, CGRect dirtyRect);
176
177     WAKWindow* m_window;
178
179     RetainPtr<CGImageRef> m_contentReplacementImage;
180
181     bool m_keepsZoomedOutTiles;
182
183     bool m_hasPendingLayoutTiles;
184     bool m_hasPendingUpdateTilingMode;
185     // Ensure there are no async calls on a dead tile cache.
186     RetainPtr<LegacyTileCacheTombstone> m_tombstone;
187
188     Optional<FloatRect> m_overrideVisibleRect;
189
190     TilingMode m_tilingMode;
191     TilingDirection m_tilingDirection;
192
193     IntSize m_tileSize;
194     bool m_tilesOpaque;
195
196     bool m_tileBordersVisible;
197     bool m_tilePaintCountersVisible;
198     bool m_acceleratedDrawingEnabled;
199     bool m_isSpeculativeTileCreationEnabled;
200
201     bool m_didCallWillStartScrollingOrZooming;
202     std::unique_ptr<LegacyTileGrid> m_zoomedOutTileGrid;
203     std::unique_ptr<LegacyTileGrid> m_zoomedInTileGrid;
204
205     Timer m_tileCreationTimer;
206
207     Vector<IntRect> m_savedDisplayRects;
208
209     float m_currentScale;
210
211     float m_pendingScale;
212     float m_pendingZoomedOutScale;
213
214     mutable Mutex m_tileMutex;
215     mutable Mutex m_savedDisplayRectMutex;
216     mutable Mutex m_contentReplacementImageMutex;
217
218     bool m_tileControllerShouldUseLowScaleTiles;
219 };
220
221 } // namespace WebCore
222
223 #endif // PLATFORM(IOS)
224
225 #endif // TileCache_h