diff options
author | Nicolas Roard <nicolas@android.com> | 2011-01-25 00:32:11 -0800 |
---|---|---|
committer | Nicolas Roard <nicolas@android.com> | 2011-01-25 00:32:11 -0800 |
commit | 3adf18ff68c18ee48f402c702f321c93eca82915 (patch) | |
tree | d38bcd2b728258f3303ce0f371c079f8cf87f903 | |
parent | 906025dec936136889f78fc35b8de36126febbfc (diff) | |
download | external_webkit-3adf18ff68c18ee48f402c702f321c93eca82915.zip external_webkit-3adf18ff68c18ee48f402c702f321c93eca82915.tar.gz external_webkit-3adf18ff68c18ee48f402c702f321c93eca82915.tar.bz2 |
Fix "jumpy" mode and textfield input
bug:3382562
bug:3384930
Change-Id: I55b97cacc9c50ae5a0b5dfc39658bb63c8aa9e87
4 files changed, 26 insertions, 15 deletions
diff --git a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index 57a53ab..52ef8ca 100644 --- a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -166,25 +166,28 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale) && (m_glWebViewState->futureViewport() != viewportTileBounds)) prepareNextTiledPage = true; + bool zooming = false; + if (m_glWebViewState->scaleRequestState() != GLWebViewState::kNoScaleRequest) { + m_glWebViewState->unlockBaseLayerUpdate(); + zooming = true; + } + // Let's prepare the page if needed if (prepareNextTiledPage) { TiledPage* nextTiledPage = m_glWebViewState->backPage(); nextTiledPage->setScale(scale); m_glWebViewState->setFutureViewport(viewportTileBounds); + m_glWebViewState->unlockBaseLayerUpdate(); nextTiledPage->prepare(goingDown, goingLeft, viewportTileBounds); } - bool zooming = false; - if (m_glWebViewState->scaleRequestState() != GLWebViewState::kNoScaleRequest) - zooming = true; - float transparency = 1; bool doSwap = false; // If we fired a request, let's check if it's ready to use if (m_glWebViewState->scaleRequestState() == GLWebViewState::kRequestNewScale) { TiledPage* nextTiledPage = m_glWebViewState->backPage(); - if (nextTiledPage->ready(viewportTileBounds)) + if (nextTiledPage->ready(viewportTileBounds, m_glWebViewState->futureScale())) m_glWebViewState->setScaleRequestState(GLWebViewState::kReceivedNewScale); } @@ -221,26 +224,29 @@ bool BaseLayerAndroid::drawBasePictureInGL(SkRect& viewport, float scale) // out of date. When standing still on the other hand, we wait until // the back page is ready before swapping the pages, ensuring that the // displayed content is in sync. - if (!zooming && !m_glWebViewState->moving()) { - if (!tiledPage->ready(preZoomBounds)) { + if (!doSwap && !zooming && !m_glWebViewState->moving()) { + if (!tiledPage->ready(preZoomBounds, m_glWebViewState->currentScale())) { + m_glWebViewState->lockBaseLayerUpdate(); nextTiledPage->setScale(m_glWebViewState->currentScale()); nextTiledPage->prepare(goingDown, goingLeft, preZoomBounds); } - if (nextTiledPage->ready(preZoomBounds)) { + if (nextTiledPage->ready(preZoomBounds, m_glWebViewState->currentScale())) { nextTiledPage->draw(transparency, preZoomBounds); + m_glWebViewState->unlockBaseLayerUpdate(); doSwap = true; } else { tiledPage->draw(transparency, preZoomBounds); } } else { // Ask for the tiles and draw -- tiles may be out of date. + m_glWebViewState->unlockBaseLayerUpdate(); tiledPage->prepare(goingDown, goingLeft, preZoomBounds); tiledPage->draw(transparency, preZoomBounds); } bool ret = false; if (m_glWebViewState->scaleRequestState() != GLWebViewState::kNoScaleRequest - || !tiledPage->ready(preZoomBounds)) + || !tiledPage->ready(preZoomBounds, m_glWebViewState->currentScale())) ret = true; if (doSwap) { diff --git a/WebCore/platform/graphics/android/GLWebViewState.cpp b/WebCore/platform/graphics/android/GLWebViewState.cpp index 326f360..252eeab 100644 --- a/WebCore/platform/graphics/android/GLWebViewState.cpp +++ b/WebCore/platform/graphics/android/GLWebViewState.cpp @@ -139,6 +139,8 @@ void GLWebViewState::setExtra(BaseLayerAndroid* layer, SkPicture& picture, const IntRect& rect) { android::Mutex::Autolock lock(m_baseLayerLock); + if (!m_baseLayerUpdate) + return; layer->setExtra(picture); if (!rect.isEmpty()) inval(rect); diff --git a/WebCore/platform/graphics/android/TiledPage.cpp b/WebCore/platform/graphics/android/TiledPage.cpp index 79509dd..ca6a6c4 100644 --- a/WebCore/platform/graphics/android/TiledPage.cpp +++ b/WebCore/platform/graphics/android/TiledPage.cpp @@ -179,8 +179,10 @@ void TiledPage::prepareRow(bool goingLeft, int tilesInRow, int firstTileX, int y void TiledPage::updateTileState(const SkIRect& tileBounds) { - if (!m_glWebViewState || tileBounds.isEmpty()) + if (!m_glWebViewState || tileBounds.isEmpty()) { + m_invalRegion.setEmpty(); return; + } const int nbTilesWidth = tileBounds.width(); const int nbTilesHeight = tileBounds.height(); @@ -216,7 +218,7 @@ void TiledPage::updateTileState(const SkIRect& tileBounds) int d = std::max(dx, dy); - XLOG("setTileLevel tile: %x, fxy(%d, %d), level: %d", tile, firstTileX, firstTileY, d); + XLOG("setTileLevel tile: %x, fxy(%d, %d), level: %d", tile, tileBounds.fLeft, tileBounds.fTop, d); tile.setUsedLevel(d); } @@ -233,7 +235,6 @@ void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBound // update the tiles distance from the viewport updateTileState(tileBounds); m_prepare = true; - m_glWebViewState->lockBaseLayerUpdate(); int firstTileX = tileBounds.fLeft; int firstTileY = tileBounds.fTop; @@ -289,7 +290,7 @@ void TiledPage::prepare(bool goingDown, bool goingLeft, const SkIRect& tileBound TilesManager::instance()->scheduleOperation(operation); } -bool TiledPage::ready(const SkIRect& tileBounds) +bool TiledPage::ready(const SkIRect& tileBounds, float scale) { if (!m_glWebViewState) return false; @@ -297,6 +298,9 @@ bool TiledPage::ready(const SkIRect& tileBounds) if (!m_invalRegion.isEmpty() && !m_prepare) return false; + if (m_scale != scale) + return false; + for (int x = tileBounds.fLeft; x < tileBounds.fRight; x++) { for (int y = tileBounds.fTop; y < tileBounds.fBottom; y++) { BaseTile* t = getBaseTile(x, y); @@ -305,7 +309,6 @@ bool TiledPage::ready(const SkIRect& tileBounds) } } m_prepare = false; - m_glWebViewState->unlockBaseLayerUpdate(); return true; } diff --git a/WebCore/platform/graphics/android/TiledPage.h b/WebCore/platform/graphics/android/TiledPage.h index a194ba5..a7402b9 100644 --- a/WebCore/platform/graphics/android/TiledPage.h +++ b/WebCore/platform/graphics/android/TiledPage.h @@ -62,7 +62,7 @@ public: // prepare the page for display on the screen void prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds); // check to see if the page is ready for display - bool ready(const SkIRect& tileBounds); + bool ready(const SkIRect& tileBounds, float scale); // draw the page on the screen void draw(float transparency, const SkIRect& tileBounds); |