DisplayListRenderer.cpp revision 5977baa1fa24125c148a72699b53e62abaf08960
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
84b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
855977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
865977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
875977baa1fa24125c148a72699b53e62abaf08960Chet Haase
885977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
905977baa1fa24125c148a72699b53e62abaf08960Chet Haase
915977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
925977baa1fa24125c148a72699b53e62abaf08960Chet Haase
935977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
945977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
955977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
965977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase
985977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mShaderResources.size(); i++) {
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i));
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mShaderResources.clear();
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1045977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1085977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1095977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1105977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1125977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mPathHeap) {
1145977baa1fa24125c148a72699b53e62abaf08960Chet Haase        for (int i = 0; i < mPathHeap->count(); i++) {
1155977baa1fa24125c148a72699b53e62abaf08960Chet Haase            caches.pathCache.removeDeferred(&(*mPathHeap)[i]);
1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase        }
1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mPathHeap->safeUnref();
1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1215977baa1fa24125c148a72699b53e62abaf08960Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder) {
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
148d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources();
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < shaderResources.size(); i++) {
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = shaderResources.itemAt(i);
1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mShaderResources.add(resource);
1535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
156d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
157d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
158d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
159d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
160d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
161d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
162d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
163d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
164d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
165d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
1679e10841c27d973b930e1b49a099c69d866659505Romain Guy    if (mPathHeap) {
1689e10841c27d973b930e1b49a099c69d866659505Romain Guy        mPathHeap->safeRef();
1699e10841c27d973b930e1b49a099c69d866659505Romain Guy    }
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::replay(OpenGLRenderer& renderer) {
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int saveCount = renderer.getSaveCount() - 1;
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
1835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
1845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
2115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
2125b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                        getInt(), getInt());
2135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2400fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
2410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy                renderer.drawDisplayList(getDisplayList());
2420fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2430fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
2604bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
2634bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
2694bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
2724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
3045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
312ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                renderer.setupColorFilter(getColorFilter());
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
317b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
323b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
3345977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
3525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
3545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
3555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
3565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
359d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
3605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mShaderResources.size(); i++) {
3615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = mShaderResources.itemAt(i);
3625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mShaderResources.clear();
365d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
366d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaints.clear();
367d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaintMap.clear();
368d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3755977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
3765977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
3775977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
3785977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
3795977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList->initFromDisplayListRenderer(*this);
3805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
3815977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
3825977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
3835977baa1fa24125c148a72699b53e62abaf08960Chet Haase
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
387b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3916b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::RestoreToCount);
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
4265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
4355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
4365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
4375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
4385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
4395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
4405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
4415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
4425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
444b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
450b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
456b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList) {
4820fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
4830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
4840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
4850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
4875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
488b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4945c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
4955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
5045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
505b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
5134bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
5145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
515b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
5194bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
5315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
538b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5435c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
544b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
551b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
559b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
5635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
5645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
568b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
572ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
573ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
577b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
581b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
5834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
589