DisplayListRenderer.cpp revision 27454a42de8b3c54cdd3b2b2a12446c2c10c8cb9
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    "AcquireContext",
86ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ReleaseContext",
87ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
88ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
89ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
90ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
91ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
92ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
93ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
94ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
954cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
96ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
97ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
98ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
99ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
100ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
101ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
102ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
103ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
1045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
105ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
106ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
107ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
10801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
10901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
110ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
111ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
112ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
115ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
116ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
117ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
118ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShadow"
119ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
1225977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1255977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1275977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1285977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1305977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase
13524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
13643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
13824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1395977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1405977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1425977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1505977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mPathHeap) {
1515977baa1fa24125c148a72699b53e62abaf08960Chet Haase        for (int i = 0; i < mPathHeap->count(); i++) {
1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase            caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
1535977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
1545977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mPathHeap->safeUnref();
1555977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1565977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
18624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
18724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
18843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        SkiaShader* shader = shaders.itemAt(i);
18943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        mShaders.add(shader);
19043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.incrementRefcount(shader);
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
196d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
197d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
198d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
199d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
200d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
201d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
2049e10841c27d973b930e1b49a099c69d866659505Romain Guy    if (mPathHeap) {
2059e10841c27d973b930e1b49a099c69d866659505Romain Guy        mPathHeap->safeRef();
2069e10841c27d973b930e1b49a099c69d866659505Romain Guy    }
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
213ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
217ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
218ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
219ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
220ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
221ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
222ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
223ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
224ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
225ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
227ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
2295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
230ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
231ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
2325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
2595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
2605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                        getInt(), getInt());
2615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
275807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
276807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy                renderer.skew(getFloat(), getFloat());
277807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
278807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
293ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy                renderer.drawDisplayList(getDisplayList(), level + 1);
2940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
2966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
297ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                renderer.drawLayer((Layer*) getInt(), getFloat(), getFloat(), getPaint());
2986c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
2996c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
3135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
3145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
3155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
3165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
3185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
3195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
3205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
3215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
3225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
3235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
3255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
3294bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
3324bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
3384bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
3414bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
35201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
35301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                renderer.drawRoundRect(getFloat(), getFloat(), getFloat(), getFloat(),
35401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                        getFloat(), getFloat(), getPaint());
35501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
35601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
35701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
35801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                renderer.drawCircle(getFloat(), getFloat(), getFloat(), getPaint());
35901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
36001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
362b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
363b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
370b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
371b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
375b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
376b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
379b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
3825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
387b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
390ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                renderer.setupColorFilter(getColorFilter());
391b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
401b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
403ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
404ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sDone", (char*) indent + 2);
405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
4145977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
4325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
4345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
4355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
4365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
4375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
439d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
44043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
44143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
44243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
44324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
44424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
44543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
44643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
44743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
448d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4555977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
4565977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
4575977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
4585977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
4595977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList->initFromDisplayListRenderer(*this);
4605977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
4615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
4625977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
4635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
469b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
470b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4716b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
472b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
473b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
474b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
47627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
47727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
47827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
47927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
48027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
48127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
485b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
490b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
495b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
501b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
50627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
5115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
516b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
5205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
5215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
5225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
5235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
5245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
5255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
5265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
5275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
5304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
541b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
546807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
547807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
548807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
549807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
550807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
551807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
553b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
559b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
566b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
572ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
5730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
5740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
5750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
5760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
577ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
5786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
579ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
580ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
5816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
5826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
5836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
5855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
586b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
5894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5925c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
5935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
594b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
5954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
6025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
603b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
6044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
6064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
6074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
6115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
6125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
6135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
6145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
6155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
6165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
6175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
6185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
6195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
6205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
6215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
6225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
6235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
6245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
6255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
6264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
6274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
6285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
629b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
6304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
6324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
6334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
6344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
639b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
6404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
6414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
6424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
6455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
646b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
6474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
65101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
65201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
65301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
65401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
65501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
65601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
65701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
65801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
65901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
66001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
66101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
66201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
66301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
66401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
66501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
6664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
667b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
6684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
6694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6725c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
673b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
6744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
6754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
6794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
680b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
6814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
6824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
6834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
6844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
688b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
6925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
6935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
6944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
697b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
6984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
701ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
702ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
7034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
706b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
710b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
718