1a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck/* 2a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * Copyright 2012, The Android Open Source Project 3a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * 4a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * Redistribution and use in source and binary forms, with or without 5a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * modification, are permitted provided that the following conditions 6a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * are met: 7a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * * Redistributions of source code must retain the above copyright 8a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * notice, this list of conditions and the following disclaimer. 9a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * * Redistributions in binary form must reproduce the above copyright 10a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * notice, this list of conditions and the following disclaimer in the 11a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * documentation and/or other materials provided with the distribution. 12a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * 13a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck */ 25a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 26a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#define LOG_TAG "CanvasLayer" 27a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#define LOG_NDEBUG 1 28a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 29a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "config.h" 30a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "CanvasLayer.h" 31a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 32a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#if USE(ACCELERATED_COMPOSITING) 33a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 34a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "AndroidLog.h" 35a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "CanvasTexture.h" 36a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu#include "DrawQuadData.h" 37a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "Image.h" 38a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "ImageBuffer.h" 39a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "RenderLayerCompositor.h" 40a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "SkBitmap.h" 41a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "SkBitmapRef.h" 42a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "SkCanvas.h" 43a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#include "TilesManager.h" 44a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 45a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Recknamespace WebCore { 46a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 47a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckCanvasLayer::CanvasLayer(RenderLayer* owner, HTMLCanvasElement* canvas) 48a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck : LayerAndroid(owner) 49a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck , m_canvas(canvas) 50a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck , m_dirtyCanvas() 51a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck , m_bitmap(0) 52a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 53a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck init(); 54a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_canvas->addObserver(this); 551e59a334a1203c7be3fff2f9dbf94fee5b879d20John Reck // Make sure we initialize in case the canvas has already been laid out 561e59a334a1203c7be3fff2f9dbf94fee5b879d20John Reck canvasResized(m_canvas); 57a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 58a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 59a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckCanvasLayer::CanvasLayer(const CanvasLayer& layer) 60a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck : LayerAndroid(layer) 61a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck , m_canvas(0) 62a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck , m_bitmap(0) 63a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 64a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck init(); 658ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck if (!layer.m_canvas) { 668ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck // The canvas has already been destroyed - this shouldn't happen 678ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck ALOGW("Creating a CanvasLayer for a destroyed canvas!"); 689e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect = IntRect(); 698ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck m_offsetFromRenderer = IntSize(); 708ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck m_texture->setHwAccelerated(false); 718ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck return; 728ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck } 73a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck // We are making a copy for the UI, sync the interesting bits 749e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect = layer.visibleContentRect(); 75a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_offsetFromRenderer = layer.offsetFromRenderer(); 76a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck bool previousState = m_texture->hasValidTexture(); 77821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck if (!previousState && layer.m_dirtyCanvas.isEmpty()) { 78821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // We were previously in software and don't have anything new to draw, 79821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // so stay in software 80a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_bitmap = layer.bitmap(); 81a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck SkSafeRef(m_bitmap); 82821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck } else { 83821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // Attempt to upload to a surface texture 84821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck if (!m_texture->uploadImageBuffer(layer.m_canvas->buffer())) { 85821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // Blargh, no surface texture or ImageBuffer - fall back to software 86821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_bitmap = layer.bitmap(); 87821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck SkSafeRef(m_bitmap); 88821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // Merge the canvas invals with the layer's invals to repaint the needed 89821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // tiles. 90821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck SkRegion::Iterator iter(layer.m_dirtyCanvas); 919e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu const IntPoint& offset = m_visibleContentRect.location(); 92821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck for (; !iter.done(); iter.next()) { 93821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck SkIRect diff = iter.rect(); 94821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck diff.fLeft += offset.x(); 95821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck diff.fRight += offset.x(); 96821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck diff.fTop += offset.y(); 97821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck diff.fBottom += offset.y(); 98821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_dirtyRegion.op(diff, SkRegion::kUnion_Op); 99821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck } 100821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck } 101821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck if (previousState != m_texture->hasValidTexture()) { 102821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // Need to do a full inval of the canvas content as we are mode switching 1039e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_dirtyRegion.op(m_visibleContentRect.x(), m_visibleContentRect.y(), 1049e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect.maxX(), m_visibleContentRect.maxY(), SkRegion::kUnion_Op); 105a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck } 106a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck } 107a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 108a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 109a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckCanvasLayer::~CanvasLayer() 110a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 111a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (m_canvas) 112a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_canvas->removeObserver(this); 113a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck SkSafeUnref(m_bitmap); 114a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 115a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 116a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::init() 117a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 118a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_texture = CanvasTexture::getCanvasTexture(this); 119a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 120a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 121a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect) 122a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 123821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck if (!m_texture->hasValidTexture()) { 124821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // We only need to track invals if we aren't using a SurfaceTexture. 125821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // If we drop out of hwa, we will do a full inval anyway 126821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck SkIRect irect = SkIRect::MakeXYWH(changedRect.x(), changedRect.y(), 127821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck changedRect.width(), changedRect.height()); 128821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_dirtyCanvas.op(irect, SkRegion::kUnion_Op); 129821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck } 130a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck owningLayer()->compositor()->scheduleLayerFlush(); 131a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 132a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 133a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::canvasResized(HTMLCanvasElement*) 134a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 135a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck const IntSize& size = m_canvas->size(); 136821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_dirtyCanvas.setRect(0, 0, size.width(), size.height()); 137821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck // If we are smaller than one tile, don't bother using a surface texture 138c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik if (size.width() <= TilesManager::tileWidth() 139c51715092b8d3be1b51cce8bae61750cbcf342c4Chris Craik && size.height() <= TilesManager::tileHeight()) 140821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_texture->setSize(IntSize()); 141821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck else 142821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck m_texture->setSize(size); 143a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 144a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 145a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::canvasDestroyed(HTMLCanvasElement*) 146a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 1478ebcb114b8559032e8dc3a05ccb8abfb36bd609bJohn Reck m_canvas = 0; 148a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 149a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 150a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::clearDirtyRegion() 151a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 152a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck LayerAndroid::clearDirtyRegion(); 153a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_dirtyCanvas.setEmpty(); 154a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (m_canvas) 155a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_canvas->clearDirtyRect(); 156a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 157a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 158a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckSkBitmapRef* CanvasLayer::bitmap() const 159a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 1601081b4dc6970126a5843ed71cd9dec5125369497John Reck if (!m_canvas || !m_canvas->buffer()) 161a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return 0; 162a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return m_canvas->copiedImage()->nativeImageForCurrentFrame(); 163a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 164a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 1659e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui ZhuIntRect CanvasLayer::visibleContentRect() const 166a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 167821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck if (!m_canvas 168821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck || !m_canvas->renderer() 169821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck || !m_canvas->renderer()->style() 170821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck || !m_canvas->inDocument() 171821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck || m_canvas->renderer()->style()->visibility() != VISIBLE) 172821fc38c9e0086ddbe1131e71eccc5b9339495f3John Reck return IntRect(); 173a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return m_canvas->renderBox()->contentBoxRect(); 174a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 175a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 176a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckIntSize CanvasLayer::offsetFromRenderer() const 177a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 178a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return m_canvas->renderBox()->layer()->backing()->graphicsLayer()->offsetFromRenderer(); 179a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 180a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 181a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckbool CanvasLayer::needsTexture() 182a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 18324aa26c6339dd710d9349515a5a413fd4fe986f2John Reck return (m_bitmap && !masksToBounds()) || LayerAndroid::needsTexture(); 184a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 185a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 186a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckvoid CanvasLayer::contentDraw(SkCanvas* canvas, PaintStyle style) 187a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 188a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck LayerAndroid::contentDraw(canvas, style); 18924aa26c6339dd710d9349515a5a413fd4fe986f2John Reck if (!m_bitmap || masksToBounds()) 190a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return; 191a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck SkBitmap& bitmap = m_bitmap->bitmap(); 1929e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu SkRect dst = SkRect::MakeXYWH(m_visibleContentRect.x() - m_offsetFromRenderer.width(), 1939e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect.y() - m_offsetFromRenderer.height(), 1949e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect.width(), m_visibleContentRect.height()); 195a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck canvas->drawBitmapRect(bitmap, 0, dst, 0); 196a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 197a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 198a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reckbool CanvasLayer::drawGL(bool layerTilesDisabled) 199a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 200a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck bool ret = LayerAndroid::drawGL(layerTilesDisabled); 201a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck m_texture->requireTexture(); 202a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (!m_bitmap && m_texture->updateTexImage()) { 2039e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu SkRect rect = SkRect::MakeXYWH(m_visibleContentRect.x() - m_offsetFromRenderer.width(), 2049e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect.y() - m_offsetFromRenderer.height(), 2059e3ead124cc10fcc888a8be7df9949d3d4ba1bb7Teng-Hui Zhu m_visibleContentRect.width(), m_visibleContentRect.height()); 206a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu TextureQuadData data(m_texture->texture(), GL_TEXTURE_EXTERNAL_OES, 207a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu GL_LINEAR, LayerQuad, &m_drawTransform, &rect); 208a31d28d03260660f592ad6914f5375b47e823aa5Teng-Hui Zhu TilesManager::instance()->shader()->drawQuad(&data); 209a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck } 210a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return ret; 211a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 212a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 213a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn ReckLayerAndroid::InvalidateFlags CanvasLayer::onSetHwAccelerated(bool hwAccelerated) 214a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck{ 215a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck if (m_texture->setHwAccelerated(hwAccelerated)) 216a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return LayerAndroid::InvalidateLayers; 217a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck return LayerAndroid::InvalidateNone; 218a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} 219a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 220a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck} // namespace WebCore 221a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck 222a144ac64329978c258faadf3bc484cf4ae6c5d0dJohn Reck#endif // USE(ACCELERATED_COMPOSITING) 223