Tile.cpp revision a52793c453c1512d0a18d4ae3108a975f998ae45
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"
35a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include "TilesManager.h"
36a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
37a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <EGL/egl.h>
38a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <EGL/eglext.h>
39a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <GLES2/gl2.h>
40a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <GLES2/gl2ext.h>
41a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
42a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG
43a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
44a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <cutils/log.h>
45a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/CurrentTime.h>
46a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#include <wtf/text/CString.h>
47a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
48a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG
49a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "BaseTile", __VA_ARGS__)
50a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
51a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#else
52a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
53a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#undef XLOG
54a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#define XLOG(...)
55a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
56a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // DEBUG
57a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
58a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardnamespace WebCore {
59a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
60a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
61a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenbergerstatic int gBaseTileCount = 0;
62a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardint BaseTile::count()
63a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
64a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    return gBaseTileCount;
65a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
66a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
67a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
68a52793c453c1512d0a18d4ae3108a975f998ae45Derek SollenbergerBaseTile::BaseTile(TiledPage* page, int x, int y)
69a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    : m_page(page)
70a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_x(x)
71a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_y(y)
72a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    , m_texture(0)
73a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    , m_scale(1)
74a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
75a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
76a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    gBaseTileCount++;
77a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
78a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
79a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
80a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas RoardBaseTile::~BaseTile()
81a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
82a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    removeTexture();
83a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    setUsedLevel(-1);
84a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG_COUNT
85a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    gBaseTileCount--;
86a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
87a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
88a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
89a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::reserveTexture()
90a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
91a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    android::Mutex::Autolock lock(m_varLock);
92a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    m_texture = TilesManager::instance()->getAvailableTexture(this);
93a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    XLOG("%x (%d, %d) reserveTexture res: %x...", this, x(), y(), m_texture);
94a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
95a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
96a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::removeTexture()
97a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
98a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    android::Mutex::Autolock lock(m_varLock);
99a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    XLOG("%x removeTexture res: %x...", this, m_texture);
100a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    m_texture = 0;
101a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
102a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
103a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::setUsedLevel(int usedLevel)
104a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
105a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (m_texture)
106a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        m_texture->setUsedLevel(usedLevel);
107a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
108a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
109a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard// Called from the main GL thread
110a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardvoid BaseTile::draw(float transparency, SkRect& rect)
111a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
112a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!m_texture) {
113a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        XLOG("%x (%d, %d) trying to draw, but no m_texture!", this, x(), y());
114a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
115a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
116a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
11719058237c678a394169062fa2f572634fd406018Derek Sollenberger    PaintingInfo info(m_x, m_y, m_page->glWebViewState());
118a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
119a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TextureInfo* textureInfo = m_texture->consumerLock();
120a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!textureInfo) {
121a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        XLOG("%x (%d, %d) trying to draw, but no textureInfo!", this, x(), y());
122a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        m_texture->consumerRelease();
123a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return;
124a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
125a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
126a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    if (m_texture->consumerTextureSimilar(info)) {
127a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        TilesManager::instance()->shader()->drawQuad(rect, textureInfo->m_textureId,
128a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard                                                     transparency);
129a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
130a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
131a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    m_texture->consumerRelease();
132a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
133a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
134a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardbool BaseTile::isBitmapReady()
135a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
136a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (!m_texture)
137a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
138a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (m_texture->owner() != this)
139a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
14019058237c678a394169062fa2f572634fd406018Derek Sollenberger    PaintingInfo info(m_x, m_y, m_page->glWebViewState());
141a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return m_texture->consumerTextureUpToDate(info);
142a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
143a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
144a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard// Called from the texture generation thread
145a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roardbool BaseTile::paintBitmap()
146a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard{
147a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    // the mutex ensures you are reading the most current value
148a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    m_varLock.lock();
149a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    const int x = m_x;
150a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    const int y = m_y;
151a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    const float scale = m_scale;
152a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TiledPage* tiledPage = m_page;
153a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    BackedDoubleBufferedTexture* texture = m_texture;
154cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard    m_varLock.unlock();
155cf1ae53e7b2853d1148ecd784379f12dffda9d43Nicolas Roard
156a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    if (!texture)
157a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
158a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
159a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    TextureInfo* textureInfo = texture->producerLock();
160a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger
161a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    // at this point we can safely check the ownership
162a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    // (if the texture got transferred to another BaseTile
163a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    // under us)
164a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    if (texture->owner() != this || texture->usedLevel() > 1) {
165a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        texture->producerRelease();
166a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return false;
167a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
168a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
169a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    PaintingInfo info(x, y, tiledPage->glWebViewState());
170a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    if (texture->consumerTextureUpToDate(info)) {
171a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger        texture->producerRelease();
172a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard        return true;
173a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    }
174a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
175a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    float tileWidth = textureInfo->m_width;
176a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    float tileHeight = textureInfo->m_height;
177a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
178a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    const float invScale = 1 / scale;
179a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    float w = tileWidth * invScale;
180a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    float h = tileHeight * invScale;
181a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
182a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    SkCanvas* canvas = texture->canvas();
183a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
184a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->save();
185a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
186a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->scale(scale, scale);
187a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    canvas->translate(-x * w, -y * h);
188a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
189a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    bool didPaint = tiledPage->paintBaseLayerContent(canvas);
190a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
191a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->restore();
192a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
193a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#ifdef DEBUG
194a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    SkPaint paint;
195a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    paint.setARGB(128, 255, 0, 0);
196a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    paint.setStrokeWidth(3);
197a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->drawLine(0, 0, tileWidth, tileHeight, paint);
198a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    paint.setARGB(128, 0, 255, 0);
199a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->drawLine(0, tileHeight, tileWidth, 0, paint);
200a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    paint.setARGB(128, 0, 0, 255);
201a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->drawLine(0, 0, tileWidth, 0, paint);
202a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    canvas->drawLine(tileWidth, 0, tileWidth, tileHeight, paint);
203a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif
204a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
205a52793c453c1512d0a18d4ae3108a975f998ae45Derek Sollenberger    texture->producerUpdate(this, textureInfo, info);
206a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
207a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard    return didPaint;
208a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard}
209a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
210a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard} // namespace WebCore
211a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard
212a5ffb7c279df240a07658953e1bd5df6d0480cb6Nicolas Roard#endif // USE(ACCELERATED_COMPOSITING)
213