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