diff options
author | Teng-Hui Zhu <ztenghui@google.com> | 2010-12-10 14:26:26 -0800 |
---|---|---|
committer | Teng-Hui Zhu <ztenghui@google.com> | 2010-12-13 11:04:58 -0800 |
commit | c9ab9bf00ba3ce8289f917675f81b40e4438a864 (patch) | |
tree | 0250b0a08f85f41ad768734f0d716753d279ce3a /WebCore/platform/graphics | |
parent | 57447b53a088f0e3b0ee75ef043db7224aac25ae (diff) | |
download | external_webkit-c9ab9bf00ba3ce8289f917675f81b40e4438a864.zip external_webkit-c9ab9bf00ba3ce8289f917675f81b40e4438a864.tar.gz external_webkit-c9ab9bf00ba3ce8289f917675f81b40e4438a864.tar.bz2 |
Prevent the usage of the texture(tile) if considered un-usable
As an example of gmail, even though clearView is called, the previous
content still show up.
This fix just use a usable flag to make sure the content
in the previously used texture is not showing up.
bug : 3215000
Change-Id: I5429a4d03547d4cd4ad10bd2153c247a4d40db7d
Diffstat (limited to 'WebCore/platform/graphics')
-rw-r--r-- | WebCore/platform/graphics/android/BaseTile.cpp | 22 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/BaseTile.h | 4 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/GLWebViewState.cpp | 7 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/TiledPage.cpp | 9 | ||||
-rw-r--r-- | WebCore/platform/graphics/android/TiledPage.h | 2 |
5 files changed, 38 insertions, 6 deletions
diff --git a/WebCore/platform/graphics/android/BaseTile.cpp b/WebCore/platform/graphics/android/BaseTile.cpp index 0f4ab4f..5701486 100644 --- a/WebCore/platform/graphics/android/BaseTile.cpp +++ b/WebCore/platform/graphics/android/BaseTile.cpp @@ -73,6 +73,7 @@ BaseTile::BaseTile() , m_texture(0) , m_scale(1) , m_dirty(true) + , m_usable(true) , m_lastDirtyPicture(0) , m_lastPaintedPicture(0) { @@ -84,7 +85,7 @@ BaseTile::BaseTile() BaseTile::~BaseTile() { setUsedLevel(-1); - if(m_texture) + if (m_texture) m_texture->release(this); #ifdef DEBUG_COUNT @@ -138,6 +139,13 @@ void BaseTile::markAsDirty(int unsigned pictureCount) m_dirty = true; } +void BaseTile::setUsable(bool usable) +{ + android::AutoMutex lock(m_atomicSync); + m_usable = usable; +} + + bool BaseTile::isDirty() { android::AutoMutex lock(m_atomicSync); @@ -159,6 +167,12 @@ void BaseTile::draw(float transparency, SkRect& rect) return; } + // Early return if set to un-usable in purpose! + if (!m_usable) { + XLOG("early return at BaseTile::draw b/c tile set to unusable !"); + return; + } + TextureInfo* textureInfo = m_texture->consumerLock(); if (!textureInfo) { XLOG("%x (%d, %d) trying to draw, but no textureInfo!", this, x(), y()); @@ -201,7 +215,7 @@ void BaseTile::paintBitmap() float scale = m_scale; m_atomicSync.unlock(); - if(!dirty || !texture) + if (!dirty || !texture) return; const int x = m_x; @@ -251,8 +265,10 @@ void BaseTile::paintBitmap() m_atomicSync.lock(); m_lastPaintedPicture = pictureCount; - if (m_lastPaintedPicture >= m_lastDirtyPicture) + if (m_lastPaintedPicture >= m_lastDirtyPicture) { m_dirty = false; + m_usable = true; + } m_atomicSync.unlock(); } diff --git a/WebCore/platform/graphics/android/BaseTile.h b/WebCore/platform/graphics/android/BaseTile.h index 8f095e3..22e85d1 100644 --- a/WebCore/platform/graphics/android/BaseTile.h +++ b/WebCore/platform/graphics/android/BaseTile.h @@ -81,7 +81,7 @@ public: void markAsDirty(const unsigned int pictureCount); bool isDirty(); - + void setUsable(bool usable); float scale() const { return m_scale; } void setScale(float scale); @@ -101,6 +101,8 @@ private: float m_scale; // used to signal that the that the tile is out-of-date and needs to be redrawn bool m_dirty; + // used to signal whether or not the draw can use this tile. + bool m_usable; // stores the id of the latest picture from webkit that caused this tile to // become dirty. A tile is no longer dirty when it has been painted with a // picture that is newer than this value. diff --git a/WebCore/platform/graphics/android/GLWebViewState.cpp b/WebCore/platform/graphics/android/GLWebViewState.cpp index 9bca91a..7c2f851 100644 --- a/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -97,6 +97,10 @@ GLWebViewState::~GLWebViewState() void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, const IntRect& rect) { android::Mutex::Autolock lock(m_baseLayerLock); + if (!layer) { + m_tiledPageA->setUsable(false); + m_tiledPageB->setUsable(false); + } if (m_baseLayer && layer) m_baseLayer->swapExtra(layer); m_baseLayer = layer; @@ -233,7 +237,8 @@ void GLWebViewState::setViewport(SkRect& viewport, float scale) static_cast<int>(ceilf(viewport.fBottom * invTileContentHeight))); } -bool GLWebViewState::hasContent() { +bool GLWebViewState::hasContent() +{ android::Mutex::Autolock lock(m_baseLayerLock); return m_baseLayer; } diff --git a/WebCore/platform/graphics/android/TiledPage.cpp b/WebCore/platform/graphics/android/TiledPage.cpp index 3a08f9b..1d2754d 100644 --- a/WebCore/platform/graphics/android/TiledPage.cpp +++ b/WebCore/platform/graphics/android/TiledPage.cpp @@ -105,6 +105,15 @@ BaseTile* TiledPage::getBaseTile(int x, int y) const return 0; } +void TiledPage::setUsable(bool usable) +{ + for (int j = 0; j < m_baseTileSize; j++) { + BaseTile& tile = m_baseTiles[j]; + tile.setUsable(usable); + } + return; +} + void TiledPage::invalidateRect(const IntRect& inval, const unsigned int pictureCount) { // Given the current scale level we need to mark the appropriate tiles as dirty diff --git a/WebCore/platform/graphics/android/TiledPage.h b/WebCore/platform/graphics/android/TiledPage.h index fa310bf..ad88bc4 100644 --- a/WebCore/platform/graphics/android/TiledPage.h +++ b/WebCore/platform/graphics/android/TiledPage.h @@ -75,7 +75,7 @@ public: void setScale(float scale) { m_scale = scale; m_invScale = 1 / scale; } void invalidateRect(const IntRect& invalRect, const unsigned int pictureCount); - + void setUsable(bool usable); private: void updateTileState(const SkIRect& tileBounds); void prepareRow(bool goingLeft, int tilesInRow, int firstTileX, int y, TileSet* set); |