diff options
Diffstat (limited to 'Source/WebCore/platform/graphics/ca/mac/TileCache.mm')
-rw-r--r-- | Source/WebCore/platform/graphics/ca/mac/TileCache.mm | 34 |
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 |