DisplayListRenderer.cpp revision 8b2f5267f16c295f12faab810527cd6311997e34
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",
110c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
1118b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
112ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
115ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
116ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
117ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
118ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
119ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShadow"
121ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
122ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1275977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
1285977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1305977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase
13724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
13843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
1395977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
14024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1425977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1505977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1515977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mPathHeap) {
1535977baa1fa24125c148a72699b53e62abaf08960Chet Haase        for (int i = 0; i < mPathHeap->count(); i++) {
1545977baa1fa24125c148a72699b53e62abaf08960Chet Haase            caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
1555977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
1565977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mPathHeap->safeUnref();
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
187d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
18824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
18924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
19043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        SkiaShader* shader = shaders.itemAt(i);
19143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        mShaders.add(shader);
19243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.incrementRefcount(shader);
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
196d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
197d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
198d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
199d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
200d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
201d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
203d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
204d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
2069e10841c27d973b930e1b49a099c69d866659505Romain Guy    if (mPathHeap) {
2079e10841c27d973b930e1b49a099c69d866659505Romain Guy        mPathHeap->safeRef();
2089e10841c27d973b930e1b49a099c69d866659505Romain Guy    }
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
215ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
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        DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
233ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
2345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
2615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
2625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                        getInt(), getInt());
2635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
277807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
278807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy                renderer.skew(getFloat(), getFloat());
279807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
280807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
295ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy                renderer.drawDisplayList(getDisplayList(), level + 1);
2960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
2986c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
299ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                renderer.drawLayer((Layer*) getInt(), getFloat(), getFloat(), getPaint());
3006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
3016c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
3155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
3165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
3175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
3185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
3205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
3215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
3225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
3235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
3245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
3255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
3275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
3314bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
3344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
3404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
3434bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
35401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
35501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                renderer.drawRoundRect(getFloat(), getFloat(), getFloat(), getFloat(),
35601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                        getFloat(), getFloat(), getPaint());
35701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
35801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
35901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
36001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy                renderer.drawCircle(getFloat(), getFloat(), getFloat(), getPaint());
36101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
36201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
363c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
364c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy                renderer.drawOval(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
365c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
366c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
3678b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
3688b2f5267f16c295f12faab810527cd6311997e34Romain Guy                renderer.drawArc(getFloat(), getFloat(), getFloat(), getFloat(),
3698b2f5267f16c295f12faab810527cd6311997e34Romain Guy                        getFloat(), getFloat(), getInt() == 1, getPaint());
3708b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
3718b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
375b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
376b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
379b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
382b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
387b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
391b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
3935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
401ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                renderer.setupColorFilter(getColorFilter());
402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
403b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
414ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
415ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sDone", (char*) indent + 2);
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
418b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
4255977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
4394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
4435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
4455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
4465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
4475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
4485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
450d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
45143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
45243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
45343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
45424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
45524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
45643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
45743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
45843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
459d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4665977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
4675977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
4685977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
4695977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
4705977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList->initFromDisplayListRenderer(*this);
4715977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
4725977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
4735977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
4745977baa1fa24125c148a72699b53e62abaf08960Chet Haase
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4826b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
485b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
486b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
48727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
48827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
48927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
49027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
49127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
49227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
493b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
501b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
506b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
51727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
5194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
5225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
5315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
5325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
5335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
5345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
5355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
5365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
5375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
5385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
540b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
546b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
5474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
552b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
557807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
558807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
559807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
560807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
561807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
562807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
564b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
570b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
577b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
583ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
5840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
5850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
5860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
5870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
588ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
5896c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
590ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
591ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
5926c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
5936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
5946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
5954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
5965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
597b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6035c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
6045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
605b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
6064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
6084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
6124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
6135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
6154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
6174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
6184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
6225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
6235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
6245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
6255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
6265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
6275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
6285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
6295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
6305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
6315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
6325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
6335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
6345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
6355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
6365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
6374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
6384bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
6395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
640b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
6414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
6434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
6444bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
6454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
650b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
6514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
6524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
6534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
6565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
657b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
6584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
66201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
66301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
66401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
66501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
66601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
66701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
66801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
66901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
67001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
67101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
67201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
67301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
67401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
67501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
67601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
677c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
678c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
679c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
680c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
681c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
682c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
683c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
6848b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
6858b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
6868b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addOp(DisplayList::DrawOval);
6878b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
6888b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
6898b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
6908b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
6918b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
6928b2f5267f16c295f12faab810527cd6311997e34Romain Guy
6934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
694b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6995c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
700b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
7014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
7024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
7064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
707b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
715b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
7195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
7205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
724b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
728ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
729ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
733b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
7344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
737b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
7384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
7394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
7404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
7414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
7444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
745