summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/TilesManager.cpp
diff options
context:
space:
mode:
authorNicolas Roard <nicolas@android.com>2011-01-17 13:22:15 -0800
committerNicolas Roard <nicolas@android.com>2011-01-18 13:02:35 -0800
commitfed0f3819356e8f1bdb6fd97c0265e2bfff1dacb (patch)
tree7c50290b4e0a7ea2651c17303b71ecf8348c272c /WebCore/platform/graphics/android/TilesManager.cpp
parentefb8822dda4a5e31ef2e6232640849a1f0736fe7 (diff)
downloadexternal_webkit-fed0f3819356e8f1bdb6fd97c0265e2bfff1dacb.zip
external_webkit-fed0f3819356e8f1bdb6fd97c0265e2bfff1dacb.tar.gz
external_webkit-fed0f3819356e8f1bdb6fd97c0265e2bfff1dacb.tar.bz2
Implement partial layer rendering (support for large layers)
Also fix a couple of potential ANRs bug:3333984 Change-Id: I28c02ef74f4c70507fcd7f5bbc893b0d0eae61c0
Diffstat (limited to 'WebCore/platform/graphics/android/TilesManager.cpp')
-rw-r--r--WebCore/platform/graphics/android/TilesManager.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/WebCore/platform/graphics/android/TilesManager.cpp b/WebCore/platform/graphics/android/TilesManager.cpp
index d6e868d..1655016 100644
--- a/WebCore/platform/graphics/android/TilesManager.cpp
+++ b/WebCore/platform/graphics/android/TilesManager.cpp
@@ -230,19 +230,17 @@ BackedDoubleBufferedTexture* TilesManager::getAvailableTexture(BaseTile* owner)
return 0;
}
-LayerTexture* TilesManager::getExistingTextureForLayer(LayerAndroid* layer)
+LayerTexture* TilesManager::getExistingTextureForLayer(LayerAndroid* layer,
+ const IntRect& rect,
+ bool any)
{
- SkSize layerSize;
- layerSize.fWidth = static_cast<int>(
- layer->getSize().fWidth * layer->getScale());
- layerSize.fHeight = static_cast<int>(
- layer->getSize().fHeight * layer->getScale());
-
android::Mutex::Autolock lock(m_texturesLock);
for (unsigned int i = 0; i< m_layersTextures.size(); i++) {
if (m_layersTextures[i]->id() != layer->uniqueId())
continue;
- if (layerSize != m_layersTextures[i]->getSize())
+ if (!any && rect != m_layersTextures[i]->rect())
+ continue;
+ if (!any && layer->getScale() != m_layersTextures[i]->scale())
continue;
XLOG("return layer %d (%x) for tile %d (%x)",
@@ -260,12 +258,11 @@ void TilesManager::printLayersTextures(const char* s)
#ifdef DEBUG
XLOG(">>> print layers textures (%s)", s);
for (unsigned int i = 0; i< m_layersTextures.size(); i++) {
- XLOG("[%d] %s, texture %x for layer %d (scale %.2f, w: %.2f, h: %.2f), owner: %x",
+ XLOG("[%d] %s, texture %x for layer %d (w: %.2f, h: %.2f), owner: %x",
i, s, m_layersTextures[i],
m_layersTextures[i]->id(),
m_layersTextures[i]->getSize().fWidth,
m_layersTextures[i]->getSize().fHeight,
- m_layersTextures[i]->getScale(),
m_layersTextures[i]->owner());
}
XLOG("<<< print layers textures (%s)", s);
@@ -293,7 +290,7 @@ void TilesManager::cleanupLayersTextures(LayerAndroid* layer, bool forceCleanup)
// that are not used by the current page
XLOG("force removing texture %x for layer %d",
texture, textureLayer->uniqueId());
- textureLayer->removeTexture();
+ textureLayer->removeTexture(texture);
}
}
@@ -327,10 +324,10 @@ void TilesManager::cleanupLayersTextures(LayerAndroid* layer, bool forceCleanup)
XLOG("after cleanup, memory %d", m_layersMemoryUsage);
}
-LayerTexture* TilesManager::createTextureForLayer(LayerAndroid* layer)
+LayerTexture* TilesManager::createTextureForLayer(LayerAndroid* layer, const IntRect& rect)
{
- int w = static_cast<int>(layer->getWidth() * layer->getScale());
- int h = static_cast<int>(layer->getHeight() * layer->getScale());
+ int w = rect.width() * layer->getScale();
+ int h = rect.height() * layer->getScale();
unsigned int size = w * h * BYTES_PER_PIXEL;
// We will not allocate textures that:
@@ -346,11 +343,16 @@ LayerTexture* TilesManager::createTextureForLayer(LayerAndroid* layer)
if (large)
return 0;
+ if (w == 0 || h == 0) // empty layer
+ return 0;
+
if (m_layersMemoryUsage + size > MAX_LAYERS_ALLOCATION)
cleanupLayersTextures(layer, true);
LayerTexture* texture = new LayerTexture(w, h);
texture->setId(layer->uniqueId());
+ texture->setRect(rect);
+ texture->setScale(layer->getScale());
android::Mutex::Autolock lock(m_texturesLock);
m_layersTextures.append(texture);