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