diff options
Diffstat (limited to 'Source/WebCore/platform/graphics/ca/mac/TileCache.mm')
-rw-r--r-- | Source/WebCore/platform/graphics/ca/mac/TileCache.mm | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/Source/WebCore/platform/graphics/ca/mac/TileCache.mm b/Source/WebCore/platform/graphics/ca/mac/TileCache.mm index 6ba528089..b12b14d11 100644 --- a/Source/WebCore/platform/graphics/ca/mac/TileCache.mm +++ b/Source/WebCore/platform/graphics/ca/mac/TileCache.mm @@ -57,9 +57,11 @@ TileCache::TileCache(WebTileCacheLayer* tileCacheLayer, const IntSize& tileSize) , m_tileRevalidationTimer(this, &TileCache::tileRevalidationTimerFired) , m_scale(1) , m_deviceScaleFactor(1) - , m_isInWindow(true) - , m_canHaveScrollbars(true) + , m_tileCoverage(CoverageForVisibleArea) + , m_isInWindow(false) + , m_scrollingPerformanceLoggingEnabled(false) , m_acceleratesDrawing(false) + , m_tilesAreOpaque(false) , m_tileDebugBorderWidth(0) { [CATransaction begin]; @@ -76,7 +78,7 @@ TileCache::~TileCache() ASSERT(isMainThread()); for (TileMap::iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) { - WebTileLayer* tileLayer = it->second.get(); + WebTileLayer* tileLayer = it->value.get(); [tileLayer setTileCache:0]; } } @@ -96,7 +98,7 @@ void TileCache::tileCacheLayerBoundsChanged() void TileCache::setNeedsDisplay() { for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) - [it->second.get() setNeedsDisplay]; + [it->value.get() setNeedsDisplay]; } void TileCache::setNeedsDisplayInRect(const IntRect& rect) @@ -177,9 +179,9 @@ void TileCache::setScale(CGFloat scale) revalidateTiles(); for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) { - [it->second.get() setContentsScale:deviceScaleFactor]; + [it->value.get() setContentsScale:deviceScaleFactor]; - IntRect tileRect = rectForTileIndex(it->first); + IntRect tileRect = rectForTileIndex(it->key); FloatRect scaledTileRect = tileRect; scaledTileRect.scale(1 / m_scale); @@ -199,12 +201,25 @@ void TileCache::setAcceleratesDrawing(bool acceleratesDrawing) m_acceleratesDrawing = acceleratesDrawing; for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) - [it->second.get() setAcceleratesDrawing:m_acceleratesDrawing]; + [it->value.get() setAcceleratesDrawing:m_acceleratesDrawing]; #else UNUSED_PARAM(acceleratesDrawing); #endif } +void TileCache::setTilesOpaque(bool opaque) +{ + if (opaque == m_tilesAreOpaque) + return; + + m_tilesAreOpaque = opaque; + + for (TileMap::iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) { + WebTileLayer* tileLayer = it->value.get(); + [tileLayer setOpaque:opaque]; + } +} + void TileCache::visibleRectChanged(const IntRect& visibleRect) { if (m_visibleRect == visibleRect) @@ -222,18 +237,17 @@ void TileCache::setIsInWindow(bool isInWindow) m_isInWindow = isInWindow; if (!m_isInWindow) { - // Schedule a timeout to drop tiles that are outside of the visible rect in 4 seconds. const double tileRevalidationTimeout = 4; scheduleTileRevalidation(tileRevalidationTimeout); } } -void TileCache::setCanHaveScrollbars(bool canHaveScrollbars) +void TileCache::setTileCoverage(TileCoverage coverage) { - if (m_canHaveScrollbars == canHaveScrollbars) + if (coverage == m_tileCoverage) return; - m_canHaveScrollbars = canHaveScrollbars; + m_tileCoverage = coverage; scheduleTileRevalidation(0); } @@ -249,7 +263,7 @@ void TileCache::setTileDebugBorderWidth(float borderWidth) m_tileDebugBorderWidth = borderWidth; for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) - [it->second.get() setBorderWidth:m_tileDebugBorderWidth]; + [it->value.get() setBorderWidth:m_tileDebugBorderWidth]; } void TileCache::setTileDebugBorderColor(CGColorRef borderColor) @@ -259,7 +273,7 @@ void TileCache::setTileDebugBorderColor(CGColorRef borderColor) m_tileDebugBorderColor = borderColor; for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) - [it->second.get() setBorderColor:m_tileDebugBorderColor.get()]; + [it->value.get() setBorderColor:m_tileDebugBorderColor.get()]; } IntRect TileCache::bounds() const @@ -297,12 +311,15 @@ IntRect TileCache::tileCoverageRect() const // If the page is not in a window (for example if it's in a background tab), we limit the tile coverage rect to the visible rect. // Furthermore, if the page can't have scrollbars (for example if its body element has overflow:hidden) it's very unlikely that the // page will ever be scrolled so we limit the tile coverage rect as well. - if (m_isInWindow && m_canHaveScrollbars) { + if (m_isInWindow) { // Inflate the coverage rect so that it covers 2x of the visible width and 3x of the visible height. // These values were chosen because it's more common to have tall pages and to scroll vertically, // so we keep more tiles above and below the current area. - tileCoverageRect.inflateX(tileCoverageRect.width() / 2); - tileCoverageRect.inflateY(tileCoverageRect.height()); + if (m_tileCoverage && CoverageForHorizontalScrolling) + tileCoverageRect.inflateX(tileCoverageRect.width() / 2); + + if (m_tileCoverage && CoverageForVerticalScrolling) + tileCoverageRect.inflateY(tileCoverageRect.height()); } return tileCoverageRect; @@ -365,9 +382,9 @@ void TileCache::revalidateTiles() Vector<TileIndex> tilesToRemove; for (TileMap::iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) { - const TileIndex& tileIndex = it->first; + const TileIndex& tileIndex = it->key; - WebTileLayer* tileLayer = it->second.get(); + WebTileLayer* tileLayer = it->value.get(); if (!rectForTileIndex(tileIndex).intersects(tileCoverageRect)) { // Remove this layer. @@ -395,7 +412,7 @@ void TileCache::revalidateTiles() TileIndex tileIndex(x, y); IntRect tileRect = rectForTileIndex(tileIndex); - RetainPtr<WebTileLayer>& tileLayer = m_tiles.add(tileIndex, 0).iterator->second; + RetainPtr<WebTileLayer>& tileLayer = m_tiles.add(tileIndex, 0).iterator->value; if (!tileLayer) { tileLayer = createTileLayer(tileRect); [m_tileContainerLayer.get() addSublayer:tileLayer.get()]; @@ -415,7 +432,7 @@ void TileCache::revalidateTiles() m_tileCoverageRect = IntRect(); for (TileMap::iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) { - const TileIndex& tileIndex = it->first; + const TileIndex& tileIndex = it->key; m_tileCoverageRect.unite(rectForTileIndex(tileIndex)); } @@ -439,7 +456,7 @@ RetainPtr<WebTileLayer> TileCache::createTileLayer(const IntRect& tileRect) [layer.get() setBorderColor:m_tileDebugBorderColor.get()]; [layer.get() setBorderWidth:m_tileDebugBorderWidth]; [layer.get() setEdgeAntialiasingMask:0]; - [layer.get() setOpaque:YES]; + [layer.get() setOpaque:m_tilesAreOpaque]; #ifndef NDEBUG [layer.get() setName:@"Tile"]; #endif @@ -463,7 +480,7 @@ bool TileCache::shouldShowRepaintCounters() const if (!layerContents) return false; - return layerContents->platformCALayerShowRepaintCounter(); + return layerContents->platformCALayerShowRepaintCounter(0); } void TileCache::drawRepaintCounter(WebTileLayer *layer, CGContextRef context) |