summaryrefslogtreecommitdiffstats
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.mm61
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)