Tile.cpp revision 417789b7c56928a5fcb610583346d07ffa380900
1a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard/* 2a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Copyright 2010, The Android Open Source Project 3a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 4a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * Redistribution and use in source and binary forms, with or without 5a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * modification, are permitted provided that the following conditions 6a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * are met: 7a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions of source code must retain the above copyright 8a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer. 9a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * * Redistributions in binary form must reproduce the above copyright 10a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * notice, this list of conditions and the following disclaimer in the 11a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * documentation and/or other materials provided with the distribution. 12a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * 13a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard */ 25a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 26a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "config.h" 27a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "BaseTile.h" 28a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 29a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#if USE(ACCELERATED_COMPOSITING) 30a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 31a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "GLUtils.h" 32a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "SkBitmap.h" 33a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "SkBitmapRef.h" 34a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "SkCanvas.h" 35776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard#include "SkPicture.h" 36a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h" 37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <EGL/egl.h> 39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <EGL/eglext.h> 40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <GLES2/gl2.h> 41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <GLES2/gl2ext.h> 423a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard#include <cutils/atomic.h> 43a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 44a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG 45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 46a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <cutils/log.h> 47a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/CurrentTime.h> 48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/text/CString.h> 49a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 50a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG 51a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTile", __VA_ARGS__) 52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 53a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#else 54a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG 56a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) 57a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 58a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // DEBUG 59a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 60a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore { 61a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 62ffc715a2e6382fe9e331557c35fafc426507b8f5Derek SollenbergerBaseTile::BaseTile() 63ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger : m_page(0) 64ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger , m_x(-1) 65ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger , m_y(-1) 66a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger , m_texture(0) 67a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard , m_scale(1) 68a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_dirty(true) 69417789b7c56928a5fcb610583346d07ffa380900John Reck , m_repaintPending(false) 70c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu , m_usable(true) 71a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_lastDirtyPicture(0) 7267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard , m_fullRepaintA(true) 7367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard , m_fullRepaintB(true) 7467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard , m_painting(false) 75a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger , m_lastPaintedPicture(0) 76a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 77a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT 78da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->increment("BaseTile"); 79a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 8067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_currentDirtyArea = &m_dirtyAreaA; 81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 82a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 83a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBaseTile::~BaseTile() 84a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 85a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger setUsedLevel(-1); 86c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu if (m_texture) 8790455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger m_texture->release(this); 8890455eb70cca2df540942299b35bb3bd8261cb0bDerek Sollenberger 89a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT 90da44133fe92ec11fa6b904c498e7e5cd23a43cbfNicolas Roard ClassTracker::instance()->decrement("BaseTile"); 91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif 92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 93a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 943a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// All the following functions must be called from the main GL thread. 953a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard 96ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenbergervoid BaseTile::setContents(TiledPage* page, int x, int y) 97ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger{ 98ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger android::AutoMutex lock(m_atomicSync); 99ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger m_page = page; 100ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger m_x = x; 101ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger m_y = y; 102ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger} 103ffc715a2e6382fe9e331557c35fafc426507b8f5Derek Sollenberger 104a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::reserveTexture() 105a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 1063a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard BackedDoubleBufferedTexture* texture = TilesManager::instance()->getAvailableTexture(this); 107a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 108a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 10967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (texture && !m_painting && 11067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture != texture) { 111a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_lastPaintedPicture = 0; 11267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullInval(); 11367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture = texture; 114a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger } 115a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 116a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 11781ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roardbool BaseTile::removeTexture(BackedDoubleBufferedTexture* texture) 118a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 119245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard XLOG("%x removeTexture res: %x... page %x", this, m_texture, m_page); 1203a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard // We update atomically, so paintBitmap() can see the correct value 121a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 12267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_painting) 12367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 124fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard if (m_texture == texture) 125fed0f3819356e8f1bdb6fd97c0265e2bfff1dacbNicolas Roard m_texture = 0; 12681ec1fafcb2c1bc433ec34b6ae4ea78d1ea7d3a8Nicolas Roard return true; 1273a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard} 1283a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard 12967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::fullInval() 13067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 13167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirtyAreaA.setEmpty(); 13267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirtyAreaB.setEmpty(); 13367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_fullRepaintA = true; 13467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_fullRepaintB = true; 13567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 13667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 13767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 1383a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roardvoid BaseTile::setScale(float scale) 1393a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard{ 140a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 14167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_scale != scale) { 14267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_scale = scale; 14367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullInval(); 14467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 145a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger} 146a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 14767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardvoid BaseTile::markAsDirty(int unsigned pictureCount, 14867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard const SkRegion& dirtyArea) 149a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{ 150a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 151a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_lastDirtyPicture = pictureCount; 15267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirtyAreaA.op(dirtyArea, SkRegion::kUnion_Op); 15367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirtyAreaB.op(dirtyArea, SkRegion::kUnion_Op); 15467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 155a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger} 156a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 157c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhuvoid BaseTile::setUsable(bool usable) 158c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu{ 159c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu android::AutoMutex lock(m_atomicSync); 160c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu m_usable = usable; 161c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu} 162c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 163c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 164a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isDirty() 165a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger{ 166a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 167a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger return m_dirty; 168a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 169a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 170417789b7c56928a5fcb610583346d07ffa380900John Reckbool BaseTile::isRepaintPending() 171417789b7c56928a5fcb610583346d07ffa380900John Reck{ 172417789b7c56928a5fcb610583346d07ffa380900John Reck android::AutoMutex lock(m_atomicSync); 173417789b7c56928a5fcb610583346d07ffa380900John Reck return m_repaintPending; 174417789b7c56928a5fcb610583346d07ffa380900John Reck} 175417789b7c56928a5fcb610583346d07ffa380900John Reck 176417789b7c56928a5fcb610583346d07ffa380900John Reckvoid BaseTile::setRepaintPending(bool pending) 177417789b7c56928a5fcb610583346d07ffa380900John Reck{ 178417789b7c56928a5fcb610583346d07ffa380900John Reck android::AutoMutex lock(m_atomicSync); 179417789b7c56928a5fcb610583346d07ffa380900John Reck m_repaintPending = pending; 180417789b7c56928a5fcb610583346d07ffa380900John Reck} 181417789b7c56928a5fcb610583346d07ffa380900John Reck 182a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::setUsedLevel(int usedLevel) 183a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 184a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (m_texture) 185a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard m_texture->setUsedLevel(usedLevel); 186a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 187a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 188417789b7c56928a5fcb610583346d07ffa380900John Reckint BaseTile::usedLevel() 189417789b7c56928a5fcb610583346d07ffa380900John Reck{ 190417789b7c56928a5fcb610583346d07ffa380900John Reck if (m_texture) 191417789b7c56928a5fcb610583346d07ffa380900John Reck return m_texture->usedLevel(); 192417789b7c56928a5fcb610583346d07ffa380900John Reck return -1; 193417789b7c56928a5fcb610583346d07ffa380900John Reck} 194417789b7c56928a5fcb610583346d07ffa380900John Reck 195a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::draw(float transparency, SkRect& rect) 196a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 19767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_x < 0 || m_y < 0) 19867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return; 19967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 200a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // No need to mutex protect reads of m_texture as it is only written to by 201a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // the consumer thread. 202a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!m_texture) { 203245e0cdd9ea80915059080a2bedbb9ebb5cc646cNicolas Roard XLOG("%x on page %x (%d, %d) trying to draw, but no m_texture!", this, m_page, x(), y()); 204a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 205a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 206a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 207c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu // Early return if set to un-usable in purpose! 2080bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu m_atomicSync.lock(); 2090bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu bool usable = m_usable; 2100bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu bool isTexturePainted = m_lastPaintedPicture; 2110bdd7f2d73cad03535071e5de0ba3d2f5feb1b00Teng-Hui Zhu m_atomicSync.unlock(); 21244009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu if (!usable) { 21344009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu XLOG("early return at BaseTile::draw b/c tile set to unusable !"); 21444009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu return; 21544009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu } 21644009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu if (!isTexturePainted) { 21744009dc8813df9eb0815bf581740a7c365f3b515Teng-Hui Zhu XLOG("early return at BaseTile::draw b/c tile is not painted !"); 218c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu return; 219c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu } 220c9ab9bf00ba3ce8289f917675f81b40e4438a864Teng-Hui Zhu 221a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger TextureInfo* textureInfo = m_texture->consumerLock(); 222a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!textureInfo) { 223a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard XLOG("%x (%d, %d) trying to draw, but no textureInfo!", this, x(), y()); 224a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_texture->consumerRelease(); 225a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return; 226a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 227a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 22867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_texture->readyFor(this)) { 22967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard XLOG("draw tile %d, %d, %.2f with texture %x", x(), y(), scale(), m_texture); 23067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TilesManager::instance()->shader()->drawQuad(rect, textureInfo->m_textureId, 23167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard transparency); 23267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 233a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger m_texture->consumerRelease(); 234a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 235a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 236a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenbergerbool BaseTile::isTileReady() 237a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 238a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (!m_texture) 239a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 240a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard if (m_texture->owner() != this) 241a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard return false; 242a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 243a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger android::AutoMutex lock(m_atomicSync); 24467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_dirty) 24567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 24667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 24767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture->consumerLock(); 24867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bool ready = m_texture->readyFor(this); 24967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_texture->consumerRelease(); 25067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 25167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (ready) 25267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return true; 25367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 25467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 25567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return false; 256a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 257a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 2587e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roardvoid BaseTile::drawTileInfo(SkCanvas* canvas, 2597e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard BackedDoubleBufferedTexture* texture, 26067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard int x, int y, float scale, 26167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard int pictureCount) 2627e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard{ 2637e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard SkPaint paint; 2647e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard char str[256]; 26567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard snprintf(str, 256, "(%d,%d) %.2f, tl%x tx%x p%x c%x", 26667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard x, y, scale, this, texture, m_page, pictureCount); 2677e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard paint.setARGB(255, 0, 0, 0); 26867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas->drawText(str, strlen(str), 0, 10, paint); 2697e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard paint.setARGB(255, 255, 0, 0); 27067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas->drawText(str, strlen(str), 0, 11, paint); 2717e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard} 2727e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard 2733a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard// This is called from the texture generation thread 27475394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roardvoid BaseTile::paintBitmap() 275a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{ 2763a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard 277a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // We acquire the values below atomically. This ensures that we are reading 278a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // values correctly across cores. Further, once we have these values they 279a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // can be updated by other threads without consequence. 280a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_atomicSync.lock(); 281a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger bool dirty = m_dirty; 282a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger BackedDoubleBufferedTexture* texture = m_texture; 28367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion dirtyArea = *m_currentDirtyArea; 28467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_painting = true; 2853a7a2aa023d51b1806d4063ab0ea5ef7d488556fNicolas Roard float scale = m_scale; 286a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger m_atomicSync.unlock(); 287cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard 28867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!dirty || !texture) { 28967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_painting = false; 29075394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard return; 29167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 292a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 293a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger const int x = m_x; 294a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger const int y = m_y; 295a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger TiledPage* tiledPage = m_page; 296a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 2977e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard texture->producerAcquireContext(); 298a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger TextureInfo* textureInfo = texture->producerLock(); 299a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger 300a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // at this point we can safely check the ownership (if the texture got 301a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger // transferred to another BaseTile under us) 302a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger if (texture->owner() != this || texture->usedLevel() > 1) { 303a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger texture->producerRelease(); 30467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_painting = false; 30575394f5ee0aac2337cdff1597b4e686e22c52833Nicolas Roard return; 306a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard } 307a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 3087e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard SkSize size = texture->getSize(); 3097e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard float tileWidth = size.width(); 3107e3773d591be20a4ddb1ef7df2709fd7655b7917Nicolas Roard float tileHeight = size.height(); 311a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 312a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger const float invScale = 1 / scale; 313a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard float w = tileWidth * invScale; 314a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard float h = tileHeight * invScale; 315a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 316b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger SkCanvas* canvas; 31767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard unsigned int pictureCount = 0; 31867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 31967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRegion::Iterator cliperator(dirtyArea); 32067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 32167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bool fullRepaint = false; 32267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA) || 32367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB)) 32467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullRepaint = true; 32567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 32667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (fullRepaint) { 32767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect rect; 32867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard pictureCount = paintPartialBitmap(rect, 0, 0, scale, texture, 32967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo, tiledPage, true); 33067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } else { 33167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard while (!cliperator.done()) { 33267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRect dirtyRect; 33367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard dirtyRect.set(cliperator.rect()); 33467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 33567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRect tileRect; 33667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard tileRect.fLeft = x * tileWidth / scale; 33767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard tileRect.fTop = y * tileHeight / scale; 33867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard tileRect.fRight = tileRect.fLeft + (tileWidth / scale); 33967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard tileRect.fBottom = tileRect.fTop + (tileHeight / scale); 34067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 34167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!tileRect.intersect(dirtyRect)) { 34267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard cliperator.next(); 34367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard continue; 34467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 34567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 34667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // recompute the rect to corresponds to pixels 34767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkRect realTileRect; 34867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard realTileRect.fLeft = floorf(tileRect.fLeft * scale); 34967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard realTileRect.fTop = floorf(tileRect.fTop * scale); 35067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard realTileRect.fRight = ceilf(tileRect.fRight * scale); 35167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard realTileRect.fBottom = ceilf(tileRect.fBottom * scale); 35267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 35367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect finalRealRect; 35467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard finalRealRect.fLeft = static_cast<int>(realTileRect.fLeft) % static_cast<int>(tileWidth); 35567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard finalRealRect.fTop = static_cast<int>(realTileRect.fTop) % static_cast<int>(tileHeight); 35667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard finalRealRect.fRight = finalRealRect.fLeft + realTileRect.width(); 35767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard finalRealRect.fBottom = finalRealRect.fTop + realTileRect.height(); 35867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 35967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // the canvas translate can be recomputed accounting for the scale 36067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float tx = - realTileRect.fLeft / scale; 36167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float ty = - realTileRect.fTop / scale; 36267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 36367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard pictureCount = paintPartialBitmap(finalRealRect, tx, ty, scale, texture, 36467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo, tiledPage); 36567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 36667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard cliperator.next(); 36767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 36867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 36967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard XLOG("%x update texture %x for tile %d, %d scale %.2f (m_scale: %.2f)", this, textureInfo, x, y, scale, m_scale); 370b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger 37167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_atomicSync.lock(); 37267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard texture->setTile(textureInfo, x, y, scale, pictureCount); 37367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard texture->producerReleaseAndSwap(); 37467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 37567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_lastPaintedPicture = pictureCount; 376a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 37767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // set the fullrepaint flags 378a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 37967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if ((m_currentDirtyArea == &m_dirtyAreaA) && m_fullRepaintA) 38067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_fullRepaintA = false; 381a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 38267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if ((m_currentDirtyArea == &m_dirtyAreaB) && m_fullRepaintB) 38367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_fullRepaintB = false; 38467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 38567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // The various checks to see if we are still dirty... 38667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 38767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = false; 38867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 38967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (m_scale != scale) 39067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 39167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 39267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!fullRepaint) 39367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_currentDirtyArea->op(dirtyArea, SkRegion::kDifference_Op); 39467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 39567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!m_currentDirtyArea->isEmpty()) 39667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 39767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 39867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard // Now we can swap the dirty areas 39967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 40067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_currentDirtyArea = m_currentDirtyArea == &m_dirtyAreaA ? &m_dirtyAreaB : &m_dirtyAreaA; 40167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 40267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!m_currentDirtyArea->isEmpty()) 40367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_dirty = true; 40467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 405c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard if (!m_dirty) 406c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard m_usable = true; 407c15781f45f0d19a925be7fd73bd10c318562db70Nicolas Roard 40867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_painting = false; 40967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 41067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard m_atomicSync.unlock(); 41167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard} 41267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 41367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roardint BaseTile::paintPartialBitmap(SkIRect r, float ptx, float pty, 41467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float scale, BackedDoubleBufferedTexture* texture, 41567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TextureInfo* textureInfo, 41667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TiledPage* tiledPage, bool fullRepaint) 41767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard{ 41867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkIRect rect = r; 41967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float tx = ptx; 42067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard float ty = pty; 42167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!texture->textureExist(textureInfo)) { 42267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard fullRepaint = true; 42367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 42467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 425a1c8c0030ee40ef422e2d7229fed1737d1b270acNicolas Roard if ((rect.width() > TilesManager::instance()->tileWidth()) || 426a1c8c0030ee40ef422e2d7229fed1737d1b270acNicolas Roard (rect.height() > TilesManager::instance()->tileHeight())) 427a1c8c0030ee40ef422e2d7229fed1737d1b270acNicolas Roard fullRepaint = true; 428a1c8c0030ee40ef422e2d7229fed1737d1b270acNicolas Roard 42967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (fullRepaint) { 43067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard rect.set(0, 0, TilesManager::instance()->tileWidth(), 43167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard TilesManager::instance()->tileHeight()); 43267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard tx = - x() * TilesManager::instance()->tileWidth() / scale; 43367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard ty = - y() * TilesManager::instance()->tileHeight() / scale; 43467e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 43567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 43667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkBitmap bitmap; 43767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); 43867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bitmap.allocPixels(); 43967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bitmap.eraseColor(0); 44067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 44167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard SkCanvas canvas(bitmap); 44267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawARGB(255, 255, 255, 255); 44367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 444776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard SkPicture picture; 445776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard SkCanvas* nCanvas = picture.beginRecording(rect.width(), rect.height()); 446776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard nCanvas->scale(scale, scale); 447776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard nCanvas->translate(tx, ty); 448776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard int pictureCount = tiledPage->paintBaseLayerContent(nCanvas); 449776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard picture.endRecording(); 450ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard 451ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard bool visualIndicator = TilesManager::instance()->getShowVisualIndicator(); 452ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard if (visualIndicator) 453ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard canvas.save(); 454776c5d4485a2b75fb4e143b0a5984cba47aaac4dNicolas Roard picture.draw(&canvas); 455ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard if (visualIndicator) 456ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard canvas.restore(); 457a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 458ce22862b0c41a8fedaf28166e857034f1484ea5cNicolas Roard if (visualIndicator) { 45967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard int color = 20 + pictureCount % 100; 46067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawARGB(color, 0, 255, 0); 46167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard 46203d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu SkPaint paint; 46303d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu paint.setARGB(128, 255, 0, 0); 46403d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu paint.setStrokeWidth(3); 46567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawLine(0, 0, rect.width(), rect.height(), paint); 46603d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu paint.setARGB(128, 0, 255, 0); 46767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawLine(0, rect.height(), rect.width(), 0, paint); 46803d850006e8ce54945fe44c36ffaf074143184c5Teng-Hui Zhu paint.setARGB(128, 0, 0, 255); 46967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawLine(0, 0, rect.width(), 0, paint); 47067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard canvas.drawLine(rect.width(), 0, rect.width(), rect.height(), paint); 471a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 47267e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard drawTileInfo(&canvas, texture, x(), y(), scale, pictureCount); 47367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 474b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger 47567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard if (!texture->textureExist(textureInfo)) { 47667e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard GLUtils::createTextureWithBitmap(textureInfo->m_textureId, bitmap); 47767e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_width = rect.width(); 47867e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard textureInfo->m_height = rect.height(); 47967e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } else { 48067e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard GLUtils::updateTextureWithBitmap(textureInfo->m_textureId, rect.fLeft, rect.fTop, bitmap); 48167e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard } 482b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger 48367e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard bitmap.reset(); 484a1e806ed3b2d9e2727d08cc2a3958fce501f6f33Derek Sollenberger 48567e4aa15702646d5ff50e9524f4e63eb9ed20122Nicolas Roard return pictureCount; 486a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} 487a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 488a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore 489a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard 490a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING) 491