DisplayListRenderer.cpp revision 2b1847ea60650a9f68372abe860415f18b55081d
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
257975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy// Defines
267975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy///////////////////////////////////////////////////////////////////////////////
277975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
287975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy#define PATH_HEAP_SIZE 64
297975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
307975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy///////////////////////////////////////////////////////////////////////////////
317975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy// Helpers
327975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy///////////////////////////////////////////////////////////////////////////////
337975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
347975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::PathHeap(): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
357975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy}
367975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
377975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::PathHeap(SkFlattenableReadBuffer& buffer): mHeap(PATH_HEAP_SIZE * sizeof(SkPath)) {
387975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    int count = buffer.readS32();
397975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
407975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    mPaths.setCount(count);
417975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath** ptr = mPaths.begin();
427975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath* p = (SkPath*) mHeap.allocThrow(count * sizeof(SkPath));
437975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
447975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    for (int i = 0; i < count; i++) {
457975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        new (p) SkPath;
467975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        p->unflatten(buffer);
477975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        *ptr++ = p;
487975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        p++;
497975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    }
507975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy}
517975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
527975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain GuyPathHeap::~PathHeap() {
537975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath** iter = mPaths.begin();
547975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath** stop = mPaths.end();
557975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    while (iter < stop) {
567975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        (*iter)->~SkPath();
577975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        iter++;
587975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    }
597975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy}
607975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
617975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guyint PathHeap::append(const SkPath& path) {
627975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath* p = (SkPath*) mHeap.allocThrow(sizeof(SkPath));
637975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    new (p) SkPath(path);
647975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    *mPaths.append() = p;
657975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    return mPaths.count();
667975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy}
677975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
687975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guyvoid PathHeap::flatten(SkFlattenableWriteBuffer& buffer) const {
697975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    int count = mPaths.count();
707975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
717975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    buffer.write32(count);
727975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath** iter = mPaths.begin();
737975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    SkPath** stop = mPaths.end();
747975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    while (iter < stop) {
757975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        (*iter)->flatten(buffer);
767975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy        iter++;
777975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    }
787975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy}
797975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy
807975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy///////////////////////////////////////////////////////////////////////////////
81b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
82b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
83b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
84ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
85ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
86ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
87ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
88ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
89ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
90ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
91ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
92ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
934cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
94ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
95ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
96ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
97ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
98ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
99ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
100ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
101ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
1025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
103ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
104ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
105ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
10601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
10701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
108c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
1098b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
110ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
111ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
112ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
115ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
116ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
117ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
118daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
119daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
121ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1265977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
1275977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1285977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1305977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase
13624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
13743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
1385977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
13924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1405977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1425977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1505977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1515977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mPathHeap) {
1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase        for (int i = 0; i < mPathHeap->count(); i++) {
1535977baa1fa24125c148a72699b53e62abaf08960Chet Haase            caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
1545977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
1555977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mPathHeap->safeUnref();
1565977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
186d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
18724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
18824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
18943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        SkiaShader* shader = shaders.itemAt(i);
19043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        mShaders.add(shader);
19143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.incrementRefcount(shader);
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
196d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
197d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
198d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
199d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
200d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
201d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
203d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
2059e10841c27d973b930e1b49a099c69d866659505Romain Guy    if (mPathHeap) {
2069e10841c27d973b930e1b49a099c69d866659505Romain Guy        mPathHeap->safeRef();
2079e10841c27d973b930e1b49a099c69d866659505Romain Guy    }
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
214daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
215daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
219ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
220ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
221ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
222ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
223ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
224ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
225ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
226ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
227ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
229ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
2315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
232ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
2335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
234daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
235daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
236daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
237daf98e941e140e8739458126640183b9f296a2abChet Haase                needsInvalidate |= renderer.callDrawGLFunction(functor);
238daf98e941e140e8739458126640183b9f296a2abChet Haase            }
239daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
241daf98e941e140e8739458126640183b9f296a2abChet Haase                int rendererNum = getInt();
242daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
243daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
247daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
252daf98e941e140e8739458126640183b9f296a2abChet Haase                int restoreCount = saveCount + getInt();
253daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
254daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
258daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
259daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
260daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
261daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
262daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
263daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
264daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
265daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
266daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
270daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
271daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
272daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
273daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
274daf98e941e140e8739458126640183b9f296a2abChet Haase                int alpha = getInt();
275daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
276daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
277daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
278daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
2795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
282daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
283daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
284daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
285daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
289daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
290daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
291daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
295daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
296daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
297daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
298daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
301807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
302daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
303daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
304daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
305daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
306807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
307807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
309daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
310daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
311daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
315daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
316daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
317daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
321daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
322daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
323daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
324daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
325daf98e941e140e8739458126640183b9f296a2abChet Haase                int regionOp = getInt();
326daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
327daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
328daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
3310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
332daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
333daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %d", (char*) indent, OP_NAMES[op],
334daf98e941e140e8739458126640183b9f296a2abChet Haase                    displayList, level + 1);
335daf98e941e140e8739458126640183b9f296a2abChet Haase                needsInvalidate |= renderer.drawDisplayList(displayList, level + 1);
3360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
3370fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
3386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
339daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
340daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
341daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
342daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
343daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
344daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
345daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
3466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
3476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
349daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
350daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
351daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
352daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
353daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
354daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
355daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
356b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
357b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
358b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
359daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
360daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
361daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
362daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
363daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
364daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
368daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
369daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
370daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
371daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
372daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
373daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
374daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
375daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
376daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
377daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
378daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
379daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
380daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
382b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
3835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
3845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
3855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
3865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
3885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
3895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
3905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
3915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
3925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
3935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
394daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
3955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
3965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
397a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
4014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
403b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
4044bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
4104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
412daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
4134bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
4144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
418daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
419daf98e941e140e8739458126640183b9f296a2abChet Haase                int xferMode = getInt();
420daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
421daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
422b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
423b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
424b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
425daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
426daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
427daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
428daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
429daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
430daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
431daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
432daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
43501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
436daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
437daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
438daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
439daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
440daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
441daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
442daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
443daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
444daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
445daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
44601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
44701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
44801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
449daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
450daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
451daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
452daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
453daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
454daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
455daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
45601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
45701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
458c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
459daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
460daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
461daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
462daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
463daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
464daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
465daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
466daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
467c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
468c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
4698b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
470daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
471daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
472daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
473daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
474daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
475daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
476daf98e941e140e8739458126640183b9f296a2abChet Haase                int i1 = getInt();
477daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
478daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
479daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
480daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
4818b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
4828b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
484daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
485daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
486daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
487daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
488b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
489b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
490b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
491b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
492b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
493daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
495b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
497b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
498b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
499daf98e941e140e8739458126640183b9f296a2abChet Haase                int count = getInt();
500daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
501daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
502daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
503daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
504daf98e941e140e8739458126640183b9f296a2abChet Haase                    text.text(), text.length(), count, x, y, paint);
505daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawText(text.text(), text.length(), count, x, y, paint);
506b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
507b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
508b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
509daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
510b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
511b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
513b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
514daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
515daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
516daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
517b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
518b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
520daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
521b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
524b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
525daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
526daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
527daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
528b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
531daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
533b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
534b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
536daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
537daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
538daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
539daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
540daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
541daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
542daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
543daf98e941e140e8739458126640183b9f296a2abChet Haase            }
544daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
545daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
546daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
547daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
548daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
549b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
550b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
551ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
552daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
553daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
554b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
555b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
556b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
5635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
5774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
5815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
5825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
5835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
5845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
5855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
5865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
5875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
588d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
58943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
59043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
59143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
59224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
59324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
59443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
59543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
59643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
597d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
6034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6045977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
6055977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
6065977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
6075977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
6085977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList->initFromDisplayListRenderer(*this);
6095977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
6105977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
6115977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
6125977baa1fa24125c148a72699b53e62abaf08960Chet Haase
613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
615b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
616b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
617b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
618b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
619b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6207d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
6217d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
623b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
624b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
625b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
62627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
62727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
62827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
62927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
63027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
63127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
634daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
635daf98e941e140e8739458126640183b9f296a2abChet Haase}
636daf98e941e140e8739458126640183b9f296a2abChet Haase
6372b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
6384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
640daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayListRenderer::callDrawGLFunction(Functor *functor) {
641daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
642daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
643daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
644daf98e941e140e8739458126640183b9f296a2abChet Haase}
645daf98e941e140e8739458126640183b9f296a2abChet Haase
6464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
647b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
6484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
6494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
6504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
653b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
6544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
6554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
65827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
6594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
6604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
6635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
664b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
6654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
6674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
668b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
6694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
6725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
6735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
6745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
6755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
6765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
6775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
6785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
6795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
6804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
681b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
6824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
6834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
6844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
687b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
6884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
6904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
693b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
6944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
698807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
699807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
700807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
701807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
702807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
703807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
7044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
705b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
7064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
718b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
724daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
7250fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
7260fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
727daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
7280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
7290fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
730ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
7316c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
732ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
733ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
7346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
7356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
7366c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
7374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
7385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
739b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
7404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
7414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
7424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7455c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
7465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
747b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
7484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
7494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
7504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
7544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
7555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
756b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
7574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
7584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
7594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
7604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
7645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
7655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
7665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
7675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
7685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
7695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
7705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
7715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
7725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
7735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
7745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
7755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
7765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
7775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
7785a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
7794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
7804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
7815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
782b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
7834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
7844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
7854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
7864bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
7874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
7884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
7934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
7944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
7954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
7985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
799b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
8004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
8014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
8024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
80401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
80501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
80601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
80701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
80801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
80901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
81001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
81101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
81201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
81301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
81401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
81501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
81601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
81701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
81801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
819c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
820c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
821c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
822c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
823c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
824c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
825c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
8268b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
8278b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
82882d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
8298b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
8308b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
8318b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
8328b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
8338b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
8348b2f5267f16c295f12faab810527cd6311997e34Romain Guy
8354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
8374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
8384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
8394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8415c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
842b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
8434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
8444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
8454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
8484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
849b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
8504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
8514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
8524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
8534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
8544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
857b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
8584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
8615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
8625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
8634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
8674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
870ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
871ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
8724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
875b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
8764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
879b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
8804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
8814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
8824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
8834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
8864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
887