diff options
Diffstat (limited to 'Source/WebCore/platform/graphics/android/TiledTexture.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/android/TiledTexture.cpp | 113 |
1 files changed, 69 insertions, 44 deletions
diff --git a/Source/WebCore/platform/graphics/android/TiledTexture.cpp b/Source/WebCore/platform/graphics/android/TiledTexture.cpp index e1e5ec9..5538e1b 100644 --- a/Source/WebCore/platform/graphics/android/TiledTexture.cpp +++ b/Source/WebCore/platform/graphics/android/TiledTexture.cpp @@ -32,6 +32,7 @@ #include "PaintedSurface.h" #include "PaintTileOperation.h" #include "SkCanvas.h" +#include "SkPicture.h" #include <cutils/log.h> #include <wtf/CurrentTime.h> @@ -54,7 +55,17 @@ namespace WebCore { -bool TiledTexture::ready() { +TiledTexture::~TiledTexture() +{ + SkSafeUnref(m_paintingPicture); +#ifdef DEBUG_COUNT + ClassTracker::instance()->decrement("TiledTexture"); +#endif + removeTiles(); +} + +bool TiledTexture::ready() +{ bool tilesAllReady = true; bool tilesVisible = false; for (unsigned int i = 0; i < m_tiles.size(); i++) { @@ -71,10 +82,23 @@ bool TiledTexture::ready() { // in order to unblock the zooming process. // FIXME: have a better system -- maybe keeping the last scale factor // able to fully render everything + XLOG("TT %p, ready %d, visible %d, texturesRemain %d", + this, tilesAllReady, tilesVisible, + TilesManager::instance()->layerTexturesRemain()); + return !TilesManager::instance()->layerTexturesRemain() || !tilesVisible || tilesAllReady; } +void TiledTexture::swapTiles() +{ + int swaps = 0; + for (unsigned int i = 0; i < m_tiles.size(); i++) + if (m_tiles[i]->swapTexturesIfNeeded()) + swaps++; + XLOG("TT %p swapping, swaps = %d", this, swaps); +} + IntRect TiledTexture::computeTilesArea(IntRect& visibleArea, float scale) { IntRect computedArea; @@ -83,6 +107,8 @@ IntRect TiledTexture::computeTilesArea(IntRect& visibleArea, float scale) ceilf(visibleArea.width() * scale), ceilf(visibleArea.height() * scale)); + XLOG("TT %p prepare, scale %f, area %d x %d", this, scale, area.width(), area.height()); + if (area.width() == 0 && area.height() == 0) { computedArea.setWidth(0); computedArea.setHeight(0); @@ -102,15 +128,13 @@ IntRect TiledTexture::computeTilesArea(IntRect& visibleArea, float scale) } void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, - bool startFastSwap, IntRect& area) + bool startFastSwap, IntRect& visibleArea) { if (!m_surface) return; - if (!m_surface->layer()) - return; - - m_area = computeTilesArea(area, scale); + // first, how many tiles do we need + m_area = computeTilesArea(visibleArea, scale); if (m_area.isEmpty()) return; @@ -130,31 +154,6 @@ void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, m_scale = scale; - // unlock if tiles all ready - bool tilesAllReady = ready(); - - // startFastSwap=true will swap all ready tiles each - // frame until all visible tiles are up to date - if (tilesAllReady) - m_swapWhateverIsReady = false; - else if (startFastSwap) - m_swapWhateverIsReady = true; - - // swap as appropriate - for (unsigned int i = 0; i < m_tiles.size(); i++) { - BaseTile* tile = m_tiles[i]; - if (tilesAllReady || m_swapWhateverIsReady) - tile->swapTexturesIfNeeded(); - } - - if (tilesAllReady) { - m_updateManager.swap(); - m_dirtyRegion.op(m_updateManager.getPaintingInval(), SkRegion::kUnion_Op); - XLOG("TT %p swapping, now painting with picture %p" - this, m_updateManager.getPaintingPicture()); - m_updateManager.clearPaintingInval(); - } - // apply dirty region to affected tiles if (!m_dirtyRegion.isEmpty()) { for (unsigned int i = 0; i < m_tiles.size(); i++) { @@ -179,12 +178,14 @@ void TiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, void TiledTexture::update(const SkRegion& invalRegion, SkPicture* picture) { - XLOG("TT %p, update manager %p updated with picture %p, region empty %d", - this, &m_updateManager, picture, invalRegion.isEmpty()); - // attempt to update inval and picture. these may be deferred below instead - // of used immediately. - m_updateManager.updateInval(invalRegion); - m_updateManager.updatePicture(picture); + XLOG("TT %p update, current region empty %d, new empty %d, painting picture %p", + this, m_dirtyRegion.isEmpty(), invalRegion.isEmpty(), picture); + m_dirtyRegion.op(invalRegion, SkRegion::kUnion_Op); + + android::Mutex::Autolock lock(m_paintingPictureSync); + SkSafeRef(picture); + SkSafeUnref(m_paintingPicture); + m_paintingPicture = picture; } void TiledTexture::prepareTile(bool repaint, int x, int y) @@ -195,7 +196,7 @@ void TiledTexture::prepareTile(bool repaint, int x, int y) m_tiles.append(tile); } - XLOG("preparing tile %p, painter is this %p", tile, this); + XLOG("preparing tile %p at %d, %d, painter is this %p", tile, x, y, this); tile->setContents(this, x, y, m_scale); // TODO: move below (which is largely the same for layers / tiled page) into @@ -203,8 +204,8 @@ void TiledTexture::prepareTile(bool repaint, int x, int y) if (tile->isDirty() || !tile->frontTexture()) tile->reserveTexture(); - LayerAndroid* layer = m_surface->layer(); - if (tile->backTexture() && tile->isDirty() && !tile->isRepaintPending() && layer) { + bool hasPicture = m_paintingPicture != 0; // safely read on UI thread, since only UI thread writes + if (tile->backTexture() && tile->isDirty() && !tile->isRepaintPending() && hasPicture) { PaintTileOperation *operation = new PaintTileOperation(tile, m_surface); TilesManager::instance()->scheduleOperation(operation); } @@ -228,6 +229,8 @@ int TiledTexture::nbTextures(IntRect& area, float scale) bool TiledTexture::draw() { + XLOG("TT %p draw", this); + #ifdef DEBUG TilesManager::instance()->getTilesTracker()->trackLayer(); #endif @@ -254,7 +257,7 @@ bool TiledTexture::draw() rect.fTop = tile->y() * tileHeight; rect.fRight = rect.fLeft + tileWidth; rect.fBottom = rect.fTop + tileHeight; - XLOG(" - [%d], { painter %x vs %x }, tile %x %d,%d at scale %.2f vs %.2f [ready: %d] dirty: %d", + XLOG("- [%d], { painter %x vs %x }, tile %x %d,%d at scale %.2f vs %.2f [ready: %d] dirty: %d", i, this, tile->painter(), tile, tile->x(), tile->y(), tile->scale(), m_scale, tile->isTileReady(), tile->isDirty()); tile->draw(m_surface->opacity(), rect, m_scale); @@ -270,7 +273,23 @@ bool TiledTexture::draw() bool TiledTexture::paint(BaseTile* tile, SkCanvas* canvas, unsigned int* pictureUsed) { - return m_updateManager.paint(tile, canvas, pictureUsed); + m_paintingPictureSync.lock(); + SkPicture* picture = m_paintingPicture; + SkSafeRef(picture); + m_paintingPictureSync.unlock(); + + if (!picture) { + XLOG("TT %p COULDNT PAINT, NO PICTURE", this); + return false; + } + + XLOG("TT %p painting with picture %p", this, picture); + + canvas->drawPicture(*picture); + + SkSafeUnref(picture); + + return true; } const TransformationMatrix* TiledTexture::transform() @@ -335,8 +354,8 @@ void DualTiledTexture::prepare(GLWebViewState* state, float scale, bool repaint, m_zooming = true; } - XLOG("\n*** %x Drawing with scale %.2f, futureScale: %.2f, zooming: %d", - this, scale, m_futureScale, m_zooming); + XLOG("Preparing DTT %p with scale %.2f, m_scale %.2f, futureScale: %.2f, zooming: %d", + this, scale, m_scale, m_futureScale, m_zooming); if (m_scale > 0) m_frontTexture->prepare(state, m_scale, repaint, startFastSwap, m_preZoomVisibleArea); @@ -373,6 +392,12 @@ void DualTiledTexture::update(const SkRegion& dirtyArea, SkPicture* picture) m_frontTexture->update(dirtyArea, picture); } +void DualTiledTexture::swapTiles() +{ + m_backTexture->swapTiles(); + m_frontTexture->swapTiles(); +} + bool DualTiledTexture::owns(BaseTileTexture* texture) { bool owns = m_textureA->owns(texture); |