DisplayListRenderer.cpp revision 24c00216687ac87fe531dc4d4168ac0c0ca04ea6
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",
95ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
96ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
97ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
98ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
99ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
100ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
101ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
102ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
103ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
104ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
105ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
106ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
107ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
108ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
109ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
110ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
111ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
112ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShadow"
115ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
116ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1215977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
1225977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1275977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1285977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1305977baa1fa24125c148a72699b53e62abaf08960Chet Haase
13124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
13224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        delete mShaders.itemAt(i);
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
13424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1385977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1395977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1405977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1425977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mPathHeap) {
1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase        for (int i = 0; i < mPathHeap->count(); i++) {
1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase            caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
1505977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mPathHeap->safeUnref();
1515977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1535977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1545977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
181d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
18224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
18324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
18424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        mShaders.add(shaders.itemAt(i));
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
187d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
188d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
189d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
190d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
191d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
196d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
1989e10841c27d973b930e1b49a099c69d866659505Romain Guy    if (mPathHeap) {
1999e10841c27d973b930e1b49a099c69d866659505Romain Guy        mPathHeap->safeRef();
2009e10841c27d973b930e1b49a099c69d866659505Romain Guy    }
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
211ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
212ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
213ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
214ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
215ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
216ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
217ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
218ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
219ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
221ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
2235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
224ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
225ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
2265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
2535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
2545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                        getInt(), getInt());
2555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2820fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
283ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy                renderer.drawDisplayList(getDisplayList(), level + 1);
2840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
2866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
287ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                renderer.drawLayer((Layer*) getInt(), getFloat(), getFloat(), getPaint());
2886c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
2896c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
3064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
3094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
3154bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3174bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
3184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
323b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
340b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
3505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
354b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
355b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
356b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
357b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
358ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                renderer.setupColorFilter(getColorFilter());
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
362b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
363b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
370b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
371ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
372ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sDone", (char*) indent + 2);
373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
375b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
3825977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
4005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
4025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
4035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
4045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
4055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
407d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
408d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaints.clear();
409d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaintMap.clear();
41024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
41124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
412d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4195977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
4205977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
4215977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
4225977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
4235977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList->initFromDisplayListRenderer(*this);
4245977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
4255977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
4265977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
4275977baa1fa24125c148a72699b53e62abaf08960Chet Haase
428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
429b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
430b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4356b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
443b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
459b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::RestoreToCount);
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
4705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
471b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
4795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
4805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
4815b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
4825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
4835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
4845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
4855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
4865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
488b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
500b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
506b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
525ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
5260fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
5270fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
5280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
5290fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
530ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
5316c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
532ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
533ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
5346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
5356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
5366c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
5385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
539b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5455c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
5465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
547b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
5555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
556b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
5594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
5644bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
5655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
566b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
5704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
576b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
5774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
5825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
583b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
589b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
5904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
5914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5945c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
595b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
5974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
602b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
6034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
6044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
6064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
610b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
6114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
6145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
6155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
6164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
619b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
6204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
623ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
624ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
6254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
6294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
6334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
6344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
6354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
6364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
6394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
640