summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/TiledTexture.cpp
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2011-08-11 18:34:30 -0700
committerNicolas Roard <nicolasroard@google.com>2011-08-17 11:42:05 -0700
commitfa807bd31774157959640810e564fbe64338e8e3 (patch)
tree2e20ab383688a960da9070df3e0e2063cfa078a5 /Source/WebCore/platform/graphics/android/TiledTexture.cpp
parentac16d73fe1d8ecf3265c93157e386e725fbb5298 (diff)
downloadexternal_webkit-fa807bd31774157959640810e564fbe64338e8e3.zip
external_webkit-fa807bd31774157959640810e564fbe64338e8e3.tar.gz
external_webkit-fa807bd31774157959640810e564fbe64338e8e3.tar.bz2
Implement partial repaint for layers (at the tile level)
Fixes a scheduling problem with layers bug:3392331 bug:5145259 Change-Id: I2ea2c91f2c6d6f5288375cb5ebdaa69819b740be
Diffstat (limited to 'Source/WebCore/platform/graphics/android/TiledTexture.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/TiledTexture.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/Source/WebCore/platform/graphics/android/TiledTexture.cpp b/Source/WebCore/platform/graphics/android/TiledTexture.cpp
index 0efcfc3..1aac44d 100644
--- a/Source/WebCore/platform/graphics/android/TiledTexture.cpp
+++ b/Source/WebCore/platform/graphics/android/TiledTexture.cpp
@@ -69,7 +69,10 @@ void TiledTexture::prepare(GLWebViewState* state, bool repaint)
for (unsigned int i = 0; i < m_tiles.size(); i++) {
BaseTile* tile = m_tiles[i];
tile->setUsedLevel(-1);
+ if (!m_dirtyRegion.isEmpty())
+ tile->markAsDirty(1, m_dirtyRegion);
}
+ m_dirtyRegion.setEmpty();
if (area.width() == 0 && area.height() == 0) {
m_area.setWidth(0);
@@ -115,6 +118,11 @@ void TiledTexture::prepare(GLWebViewState* state, bool repaint)
}
}
+void TiledTexture::markAsDirty(const SkRegion& dirtyArea)
+{
+ m_dirtyRegion.op(dirtyArea, SkRegion::kUnion_Op);
+}
+
void TiledTexture::prepareTile(bool repaint, int x, int y)
{
BaseTile* tile = getTile(x, y);
@@ -130,11 +138,7 @@ void TiledTexture::prepareTile(bool repaint, int x, int y)
tile->setUsedLevel(0);
bool schedule = false;
- if (repaint)
- tile->fullInval();
- if (!tile->isTileReady())
- schedule = true;
- if (repaint || tile->isDirty())
+ if (tile->isDirty())
schedule = true;
LayerAndroid* layer = m_surface->layer();
@@ -183,7 +187,7 @@ bool TiledTexture::draw()
rect.fTop = tile->y() * tileHeight;
rect.fRight = rect.fLeft + tileWidth;
rect.fBottom = rect.fTop + tileHeight;
- XLOG(" - [%d], { painter %x vs %x }, tile %x %d,%d at scale %.2f [ready: %d]", i, this, tile->painter(), tile, tile->x(), tile->y(), tile->scale(), tile->isTileReady());
+ XLOG(" - [%d], { painter %x vs %x }, tile %x %d,%d at scale %.2f [ready: %d] dirty: %d", i, this, tile->painter(), tile, tile->x(), tile->y(), tile->scale(), tile->isTileReady(), tile->isDirty());
askRedraw |= !tile->isTileReady();
tile->draw(m_surface->opacity(), rect, m_surface->scale());
#ifdef DEBUG