summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform
diff options
context:
space:
mode:
authorChris Craik <ccraik@google.com>2011-10-26 14:36:07 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2011-10-26 14:36:07 +0000
commitf91221561daa0b57bbf41408d031c2643b769727 (patch)
treefee3159c9cb95d0194e880f5ac9509d9ec0fdea3 /Source/WebCore/platform
parentaae0d8559e1daa4204f41ab4ed7c9d73769af3b3 (diff)
parentc43f9396708d95ecbce1f4ef65530999fab96c0d (diff)
downloadexternal_webkit-f91221561daa0b57bbf41408d031c2643b769727.zip
external_webkit-f91221561daa0b57bbf41408d031c2643b769727.tar.gz
external_webkit-f91221561daa0b57bbf41408d031c2643b769727.tar.bz2
am c43f9396: Merge "Don\'t draw prefetch page if not necessary" into ics-mr1
* commit 'c43f9396708d95ecbce1f4ef65530999fab96c0d': Don't draw prefetch page if not necessary
Diffstat (limited to 'Source/WebCore/platform')
-rw-r--r--Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp27
-rw-r--r--Source/WebCore/platform/graphics/android/BaseLayerAndroid.h2
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.cpp24
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.h3
4 files changed, 33 insertions, 23 deletions
diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp
index 15595e4..2a1b1de 100644
--- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp
+++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.cpp
@@ -113,7 +113,7 @@ void BaseLayerAndroid::drawCanvas(SkCanvas* canvas)
#if USE(ACCELERATED_COMPOSITING)
void BaseLayerAndroid::prefetchBasePicture(SkRect& viewport, float currentScale,
- TiledPage* prefetchTiledPage)
+ TiledPage* prefetchTiledPage, bool draw)
{
SkIRect bounds;
float prefetchScale = currentScale * PREFETCH_SCALE_MODIFIER;
@@ -151,7 +151,8 @@ void BaseLayerAndroid::prefetchBasePicture(SkRect& viewport, float currentScale,
prefetchTiledPage->swapBuffersIfReady(bounds,
prefetchScale,
TiledPage::SwapWhateverIsReady);
- prefetchTiledPage->draw(PREFETCH_OPACITY, bounds);
+ if (draw)
+ prefetchTiledPage->draw(PREFETCH_OPACITY, bounds);
}
bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale,
@@ -224,7 +225,7 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale,
// When we aren't zooming, we should TRY and swap tile buffers if they're
// ready. When scrolling, we swap whatever's ready. Otherwise, buffer until
// the entire page is ready and then swap.
- bool buffersSwapped = false;
+ bool tilesFinished = false;
if (!zooming) {
TiledPage::SwapMethod swapMethod;
if (scrolling)
@@ -232,13 +233,13 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale,
else
swapMethod = TiledPage::SwapWholePage;
- buffersSwapped = tiledPage->swapBuffersIfReady(preZoomBounds,
+ tilesFinished = tiledPage->swapBuffersIfReady(preZoomBounds,
zoomManager->currentScale(),
swapMethod);
- if (buffersSwappedPtr && buffersSwapped)
+ if (buffersSwappedPtr && tilesFinished)
*buffersSwappedPtr = true;
- if (buffersSwapped) {
+ if (tilesFinished) {
if (m_scrollState == ScrollingFinishPaint) {
m_scrollState = NotScrolling;
scrolling = false;
@@ -254,7 +255,7 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale,
}
- bool needsRedraw = scrolling || zooming || !buffersSwapped;
+ bool needsRedraw = scrolling || zooming || !tilesFinished;
// if we don't expect to redraw, unlock the invals
if (!needsRedraw)
@@ -272,15 +273,19 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale,
TiledPage::ExpandedBounds);
}
- XLOG("scrolling %d, zooming %d, buffersSwapped %d, needsRedraw %d",
- scrolling, zooming, buffersSwapped, needsRedraw);
+ XLOG("scrolling %d, zooming %d, tilesFinished %d, needsRedraw %d",
+ scrolling, zooming, tilesFinished, needsRedraw);
// prefetch in the nextTiledPage if unused by zooming (even if not scrolling
// since we want the tiles to be ready before they're needed)
bool usePrefetchPage = !zooming;
nextTiledPage->setIsPrefetchPage(usePrefetchPage);
- if (usePrefetchPage)
- prefetchBasePicture(viewport, scale, nextTiledPage);
+ if (usePrefetchPage) {
+ // if the non-prefetch page isn't missing tiles, don't bother drawing
+ // prefetch page
+ bool drawPrefetchPage = tiledPage->hasMissingContent(preZoomBounds);
+ prefetchBasePicture(viewport, scale, nextTiledPage, drawPrefetchPage);
+ }
tiledPage->draw(transparency, preZoomBounds);
diff --git a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h
index 09a086a..ad77013 100644
--- a/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h
+++ b/Source/WebCore/platform/graphics/android/BaseLayerAndroid.h
@@ -65,7 +65,7 @@ public:
private:
#if USE(ACCELERATED_COMPOSITING)
void prefetchBasePicture(SkRect& viewport, float currentScale,
- TiledPage* prefetchTiledPage);
+ TiledPage* prefetchTiledPage, bool draw);
bool drawBasePictureInGL(SkRect& viewport, float scale, double currentTime,
bool* buffersSwappedPtr);
diff --git a/Source/WebCore/platform/graphics/android/TiledPage.cpp b/Source/WebCore/platform/graphics/android/TiledPage.cpp
index 99d8a47..c097c58 100644
--- a/Source/WebCore/platform/graphics/android/TiledPage.cpp
+++ b/Source/WebCore/platform/graphics/android/TiledPage.cpp
@@ -290,6 +290,19 @@ void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBound
m_prepare = true;
}
+bool TiledPage::hasMissingContent(const SkIRect& tileBounds)
+{
+ int neededTiles = tileBounds.width() * tileBounds.height();
+ for (int j = 0; j < m_baseTileSize; j++) {
+ BaseTile& tile = m_baseTiles[j];
+ if (tileBounds.contains(tile.x(), tile.y())) {
+ if (tile.frontTexture())
+ neededTiles--;
+ }
+ }
+ return neededTiles > 0;
+}
+
bool TiledPage::swapBuffersIfReady(const SkIRect& tileBounds, float scale, SwapMethod swap)
{
if (!m_glWebViewState)
@@ -342,18 +355,9 @@ void TiledPage::draw(float transparency, const SkIRect& tileBounds)
const float tileWidth = TilesManager::tileWidth() * m_invScale;
const float tileHeight = TilesManager::tileHeight() * m_invScale;
- SkIRect actualTileBounds = tileBounds;
- actualTileBounds.fTop -= m_glWebViewState->expandedTileBoundsY();
- actualTileBounds.fBottom += m_glWebViewState->expandedTileBoundsY();
- actualTileBounds.fLeft -= m_glWebViewState->expandedTileBoundsX();
- actualTileBounds.fRight += m_glWebViewState->expandedTileBoundsX();
-
- actualTileBounds.fTop = std::max(0, actualTileBounds.fTop);
- actualTileBounds.fLeft = std::max(0, actualTileBounds.fLeft);
-
for (int j = 0; j < m_baseTileSize; j++) {
BaseTile& tile = m_baseTiles[j];
- bool tileInView = actualTileBounds.contains(tile.x(), tile.y());
+ bool tileInView = tileBounds.contains(tile.x(), tile.y());
if (tileInView) {
SkRect rect;
rect.fLeft = tile.x() * tileWidth;
diff --git a/Source/WebCore/platform/graphics/android/TiledPage.h b/Source/WebCore/platform/graphics/android/TiledPage.h
index 764bb36..960f3d5 100644
--- a/Source/WebCore/platform/graphics/android/TiledPage.h
+++ b/Source/WebCore/platform/graphics/android/TiledPage.h
@@ -73,7 +73,8 @@ public:
// dirty (and thus repaint needed)
bool updateTileDirtiness(const SkIRect& tileBounds);
- // check to see if the page is ready for display
+ // returns true if the page can't draw the entire region (may still be stale)
+ bool hasMissingContent(const SkIRect& tileBounds);
// swap 'buffers' by swapping each modified texture
bool swapBuffersIfReady(const SkIRect& tileBounds, float scale, SwapMethod swap);