summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-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/GLWebViewState.cpp3
-rw-r--r--Source/WebCore/platform/graphics/android/PaintedSurface.cpp6
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.cpp24
-rw-r--r--Source/WebCore/platform/graphics/android/TiledPage.h3
-rw-r--r--Source/WebCore/platform/graphics/android/TiledTexture.cpp2
-rw-r--r--Source/WebCore/rendering/RenderLayer.h2
8 files changed, 39 insertions, 30 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/GLWebViewState.cpp b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
index 4c6161a..e53a1e1 100644
--- a/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
+++ b/Source/WebCore/platform/graphics/android/GLWebViewState.cpp
@@ -162,11 +162,10 @@ void GLWebViewState::setBaseLayer(BaseLayerAndroid* layer, const SkRegion& inval
} else {
m_currentBaseLayerRoot = 0;
}
- if (m_currentBaseLayerRoot && oldRoot)
+ if (oldRoot != m_currentBaseLayerRoot)
TilesManager::instance()->swapLayersTextures(oldRoot, m_currentBaseLayerRoot);
SkSafeUnref(oldRoot);
-
// We only update the base layer if we are not currently
// waiting for a tiledPage to be painted
if (m_baseLayerUpdate) {
diff --git a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
index 2bf4bcf..c0597a9 100644
--- a/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
+++ b/Source/WebCore/platform/graphics/android/PaintedSurface.cpp
@@ -155,7 +155,7 @@ void PaintedSurface::prepare(GLWebViewState* state)
m_scale = state->scale();
- XLOGC("%x layer %d %x prepared at size (%d, %d) @ scale %.2f", this, m_layer->uniqueId(),
+ XLOG("%x layer %d %x prepared at size (%d, %d) @ scale %.2f", this, m_layer->uniqueId(),
m_layer, w, h, m_scale);
m_tiledTexture->prepare(state, m_scale, m_pictureUsed != m_layer->pictureUsed(),
@@ -201,8 +201,8 @@ void PaintedSurface::computeVisibleArea() {
if (!m_visibleArea.isEmpty()) {
float tileWidth = TilesManager::instance()->layerTileWidth();
float tileHeight = TilesManager::instance()->layerTileHeight();
- int w = ceilf(m_area.width() / tileWidth);
- int h = ceilf(m_area.height() / tileHeight);
+ int w = ceilf(m_area.width() * m_scale / tileWidth);
+ int h = ceilf(m_area.height() * m_scale / tileHeight);
if (w * h < MAX_UNCLIPPED_AREA)
m_visibleArea = m_area;
}
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);
diff --git a/Source/WebCore/platform/graphics/android/TiledTexture.cpp b/Source/WebCore/platform/graphics/android/TiledTexture.cpp
index 35ce35f..b252303 100644
--- a/Source/WebCore/platform/graphics/android/TiledTexture.cpp
+++ b/Source/WebCore/platform/graphics/android/TiledTexture.cpp
@@ -71,7 +71,7 @@ bool TiledTexture::ready() {
// FIXME: have a better system -- maybe keeping the last scale factor
// able to fully render everything
return !TilesManager::instance()->layerTexturesRemain()
- || (tilesAllReady && tilesVisible);
+ || !tilesVisible || tilesAllReady;
}
void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint,
diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h
index f257593..02ab8e9 100644
--- a/Source/WebCore/rendering/RenderLayer.h
+++ b/Source/WebCore/rendering/RenderLayer.h
@@ -354,7 +354,7 @@ public:
if (hasOverflowScroll())
return true;
#endif
- return !hasAutoZIndex() || renderer()->isRenderView() || (isComposited() && isFixed()) || m_shouldComposite;
+ return !hasAutoZIndex() || renderer()->isRenderView() || (isComposited() && isFixed());
}
#else
#if ENABLE(ANDROID_OVERFLOW_SCROLL)