https://bugs.webkit.org/show_bug.cgi?id=100169
[WebKit-https.git] / Source / WebCore / platform / graphics / ca / mac / TileCache.h
1 /*
2  * Copyright (C) 2011 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 TileCache_h
27 #define TileCache_h
28
29 #include "IntPointHash.h"
30 #include "IntRect.h"
31 #include "TiledBacking.h"
32 #include "Timer.h"
33 #include <wtf/HashMap.h>
34 #include <wtf/Noncopyable.h>
35 #include <wtf/PassOwnPtr.h>
36 #include <wtf/RetainPtr.h>
37
38 OBJC_CLASS CALayer;
39 OBJC_CLASS WebTileCacheLayer;
40 OBJC_CLASS WebTileLayer;
41
42 namespace WebCore {
43
44 class FloatRect;
45 class IntPoint;
46 class IntRect;
47
48 typedef Vector<RetainPtr<WebTileLayer> > WebTileLayerList;
49
50 class TileCache : public TiledBacking {
51     WTF_MAKE_NONCOPYABLE(TileCache);
52
53 public:
54     static PassOwnPtr<TileCache> create(WebTileCacheLayer*);
55     ~TileCache();
56
57     void tileCacheLayerBoundsChanged();
58
59     void setNeedsDisplay();
60     void setNeedsDisplayInRect(const IntRect&);
61     void drawLayer(WebTileLayer *, CGContextRef);
62
63     void setScale(CGFloat);
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     CALayer *tileContainerLayer() const { return m_tileContainerLayer.get(); }
72
73     void setTileDebugBorderWidth(float);
74     void setTileDebugBorderColor(CGColorRef);
75
76     virtual IntRect visibleRect() const OVERRIDE { return m_visibleRect; }
77
78     unsigned blankPixelCount() const;
79     static unsigned blankPixelCountForTiles(const WebTileLayerList&, IntRect, IntPoint);
80
81 private:
82     TileCache(WebTileCacheLayer*);
83
84     // TiledBacking member functions.
85     virtual void setVisibleRect(const IntRect&) OVERRIDE;
86     virtual void setIsInWindow(bool) OVERRIDE;
87     virtual void setTileCoverage(TileCoverage) OVERRIDE;
88     virtual TileCoverage tileCoverage() const OVERRIDE { return m_tileCoverage; }
89     virtual void forceRepaint() OVERRIDE;
90     virtual void setScrollingPerformanceLoggingEnabled(bool flag) OVERRIDE { m_scrollingPerformanceLoggingEnabled = flag; }
91     virtual bool scrollingPerformanceLoggingEnabled() const OVERRIDE { return m_scrollingPerformanceLoggingEnabled; }
92
93     virtual IntRect tileCoverageRect() const { return m_tileCoverageRect; }
94     
95     IntRect bounds() const;
96
97     typedef IntPoint TileIndex;
98     IntRect rectForTileIndex(const TileIndex&) const;
99     void getTileIndexRangeForRect(const IntRect&, TileIndex& topLeft, TileIndex& bottomRight);
100
101     IntRect computeTileCoverageRect() const;
102     IntSize tileSizeForCoverageRect(const IntRect&) const;
103
104     void scheduleTileRevalidation(double interval);
105     void tileRevalidationTimerFired(Timer<TileCache>*);
106     void revalidateTiles();
107
108     WebTileLayer* tileLayerAtIndex(const TileIndex&) const;
109     RetainPtr<WebTileLayer> createTileLayer(const IntRect&);
110
111     bool shouldShowRepaintCounters() const;
112     void drawRepaintCounter(WebTileLayer *, CGContextRef);
113
114     WebTileCacheLayer* m_tileCacheLayer;
115     RetainPtr<CALayer> m_tileContainerLayer;
116     IntSize m_tileSize;
117     IntRect m_visibleRect;
118
119     typedef HashMap<TileIndex, RetainPtr<WebTileLayer> > TileMap;
120     TileMap m_tiles;
121     Timer<TileCache> m_tileRevalidationTimer;
122     IntRect m_tileCoverageRect;
123
124     CGFloat m_scale;
125     CGFloat m_deviceScaleFactor;
126
127     TileCoverage m_tileCoverage;
128     bool m_isInWindow;
129     bool m_scrollingPerformanceLoggingEnabled;
130     bool m_acceleratesDrawing;
131     bool m_tilesAreOpaque;
132
133     RetainPtr<CGColorRef> m_tileDebugBorderColor;
134     float m_tileDebugBorderWidth;
135 };
136
137 } // namespace WebCore
138
139 #endif // TileCache_h