summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/ca/mac/TileCache.mm
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/ca/mac/TileCache.mm')
-rw-r--r--Source/WebCore/platform/graphics/ca/mac/TileCache.mm34
1 files changed, 34 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/ca/mac/TileCache.mm b/Source/WebCore/platform/graphics/ca/mac/TileCache.mm
index f79c63b29..67027979d 100644
--- a/Source/WebCore/platform/graphics/ca/mac/TileCache.mm
+++ b/Source/WebCore/platform/graphics/ca/mac/TileCache.mm
@@ -28,6 +28,7 @@
#import "IntRect.h"
#import "PlatformCALayer.h"
+#import "Region.h"
#import "WebLayer.h"
#import "WebTileCacheLayer.h"
#import "WebTileLayer.h"
@@ -73,6 +74,11 @@ TileCache::TileCache(WebTileCacheLayer* tileCacheLayer, const IntSize& tileSize)
TileCache::~TileCache()
{
ASSERT(isMainThread());
+
+ for (TileMap::iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) {
+ WebTileLayer* tileLayer = it->second.get();
+ [tileLayer setTileCache:0];
+ }
}
void TileCache::tileCacheLayerBoundsChanged()
@@ -306,6 +312,34 @@ void TileCache::tileRevalidationTimerFired(Timer<TileCache>*)
revalidateTiles();
}
+unsigned TileCache::blankPixelCount() const
+{
+ WebTileLayerList tiles(m_tiles.size());
+ tiles.appendRange(m_tiles.begin().values(), m_tiles.end().values());
+
+ return blankPixelCountForTiles(tiles, m_visibleRect, IntPoint(0,0));
+}
+
+unsigned TileCache::blankPixelCountForTiles(const WebTileLayerList& tiles, IntRect visibleRect, IntPoint tileTranslation)
+{
+ Region paintedVisibleTiles;
+
+ for (WebTileLayerList::const_iterator it = tiles.begin(), end = tiles.end(); it != end; ++it) {
+ const WebTileLayer* tileLayer = it->get();
+
+ IntRect visiblePart(CGRectOffset([tileLayer frame], tileTranslation.x(), tileTranslation.y()));
+ visiblePart.intersect(visibleRect);
+
+ if (!visiblePart.isEmpty() && [tileLayer repaintCount])
+ paintedVisibleTiles.unite(visiblePart);
+ }
+
+ Region uncoveredRegion(visibleRect);
+ uncoveredRegion.subtract(paintedVisibleTiles);
+
+ return uncoveredRegion.totalArea();
+}
+
void TileCache::revalidateTiles()
{
// If the underlying PlatformLayer has been destroyed, but the WebTileCacheLayer hasn't