diff options
author | Nicolas Roard <nicolasroard@google.com> | 2011-11-04 13:56:14 -0700 |
---|---|---|
committer | Nicolas Roard <nicolasroard@google.com> | 2011-11-10 18:27:56 -0800 |
commit | 5997528e55d0dc6734718bde61faa8513b1dd54f (patch) | |
tree | 62b22677aeffd0f36ee9aa5c283e7eaab9cf9b1d /Source/WebCore/platform/graphics/android/TiledTexture.cpp | |
parent | c97291b2e7a966abf8dbad5cf2e0e8b033c3cd90 (diff) | |
download | external_webkit-5997528e55d0dc6734718bde61faa8513b1dd54f.zip external_webkit-5997528e55d0dc6734718bde61faa8513b1dd54f.tar.gz external_webkit-5997528e55d0dc6734718bde61faa8513b1dd54f.tar.bz2 |
Fallback mode when running out of textures for layers
- Implements a degraded rendering mode when running out of textures
- Speed up rendering by reusing the same SkBitmap in RasterRenderer
- Some refactoring
bug:5279231
Change-Id: I52943a87bed56c49b01b47fea4fa1a5c49e09e93
Diffstat (limited to 'Source/WebCore/platform/graphics/android/TiledTexture.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/android/TiledTexture.cpp | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/Source/WebCore/platform/graphics/android/TiledTexture.cpp b/Source/WebCore/platform/graphics/android/TiledTexture.cpp index b252303..e1e5ec9 100644 --- a/Source/WebCore/platform/graphics/android/TiledTexture.cpp +++ b/Source/WebCore/platform/graphics/android/TiledTexture.cpp @@ -59,12 +59,13 @@ bool TiledTexture::ready() { bool tilesVisible = false; for (unsigned int i = 0; i < m_tiles.size(); i++) { BaseTile* tile = m_tiles[i]; - if (tile->isTileVisible(m_area) && !tile->isTileReady()) { - tilesAllReady = false; - break; - } - if (tile->isTileVisible(m_area)) + if (tile->isTileVisible(m_area)) { tilesVisible = true; + if (!tile->isTileReady()) { + tilesAllReady = false; + break; + } + } } // For now, if no textures are available, consider ourselves as ready // in order to unblock the zooming process. @@ -74,38 +75,47 @@ bool TiledTexture::ready() { || !tilesVisible || tilesAllReady; } -void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, - bool startFastSwap, IntRect& visibleArea) +IntRect TiledTexture::computeTilesArea(IntRect& visibleArea, float scale) { - if (!m_surface) - return; - - if (!m_surface->layer()) - return; - - // first, how many tiles do we need + IntRect computedArea; IntRect area(visibleArea.x() * scale, visibleArea.y() * scale, ceilf(visibleArea.width() * scale), ceilf(visibleArea.height() * scale)); if (area.width() == 0 && area.height() == 0) { - m_area.setWidth(0); - m_area.setHeight(0); - return; + computedArea.setWidth(0); + computedArea.setHeight(0); + return computedArea; } int tileWidth = TilesManager::instance()->layerTileWidth(); int tileHeight = TilesManager::instance()->layerTileHeight(); - m_area.setX(area.x() / tileWidth); - m_area.setY(area.y() / tileHeight); + computedArea.setX(area.x() / tileWidth); + computedArea.setY(area.y() / tileHeight); float right = (area.x() + area.width()) / (float) tileWidth; float bottom = (area.y() + area.height()) / (float) tileHeight; - m_area.setWidth(ceilf(right) - m_area.x()); - m_area.setHeight(ceilf(bottom) - m_area.y()); + computedArea.setWidth(ceilf(right) - computedArea.x()); + computedArea.setHeight(ceilf(bottom) - computedArea.y()); + return computedArea; +} - XLOG("for TiledTexture %p, we prepare with scale %.2f, have a visible area of %d, %d - %d x %d, corresponding to %d, %d x - %d x %d tiles", +void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, + bool startFastSwap, IntRect& area) +{ + if (!m_surface) + return; + + if (!m_surface->layer()) + return; + + m_area = computeTilesArea(area, scale); + if (m_area.isEmpty()) + return; + + XLOG("for TiledTexture %p, we prepare with scale %.2f, have a visible area of " + " %d, %d - %d x %d, corresponding to %d, %d x - %d x %d tiles", this, scale, visibleArea.x(), visibleArea.y(), visibleArea.width(), visibleArea.height(), @@ -210,6 +220,12 @@ BaseTile* TiledTexture::getTile(int x, int y) return 0; } +int TiledTexture::nbTextures(IntRect& area, float scale) +{ + IntRect computedTilesArea = computeTilesArea(area, scale); + return computedTilesArea.width() * computedTilesArea.height(); +} + bool TiledTexture::draw() { #ifdef DEBUG |