summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Roard <nicolas@android.com>2011-01-25 00:32:11 -0800
committerNicolas Roard <nicolas@android.com>2011-01-25 00:32:11 -0800
commit3adf18ff68c18ee48f402c702f321c93eca82915 (patch)
treed38bcd2b728258f3303ce0f371c079f8cf87f903
parent906025dec936136889f78fc35b8de36126febbfc (diff)
downloadexternal_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
-rw-r--r--WebCore/platform/graphics/android/BaseLayerAndroid.cpp24
-rw-r--r--WebCore/platform/graphics/android/GLWebViewState.cpp2
-rw-r--r--WebCore/platform/graphics/android/TiledPage.cpp13
-rw-r--r--WebCore/platform/graphics/android/TiledPage.h2
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);