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