summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/TiledTexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/graphics/android/TiledTexture.cpp')
-rw-r--r--Source/WebCore/platform/graphics/android/TiledTexture.cpp113
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);