DisplayListRenderer.cpp revision 0fe478ea04720a57ef3919dbc23711bc7eba517f
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) {
85b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
87b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
88b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
89b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
90b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
91b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
92b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
93b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
94b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
95b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
96b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
97b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.reset(&recorder.mRCRecorder);
98b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mRCPlayback.setupBuffer(mReader);
99b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
100b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.reset(&recorder.mTFRecorder);
101b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mTFPlayback.setupBuffer(mReader);
102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
111d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources();
1135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < shaderResources.size(); i++) {
1145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = shaderResources.itemAt(i);
1155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mShaderResources.add(resource);
1165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
119d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
120d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
121d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
122d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
123d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
124d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
125d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
126d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
127d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
128d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeRef();
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::~DisplayList() {
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    sk_free((void*) mReader.base());
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    Caches& caches = Caches::getInstance();
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
139d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
142d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mShaderResources.size(); i++) {
144d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        caches.resourceCache.decrementRefcount(mShaderResources.itemAt(i));
1455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mShaderResources.clear();
147d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
148d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
149d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        delete mPaints.itemAt(i);
150d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
151d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaints.clear();
152d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
153d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
154d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        delete  mMatrices.itemAt(i);
155d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
156d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
157d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeUnref();
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::replay(OpenGLRenderer& renderer) {
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int saveCount = renderer.getSaveCount() - 1;
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
1725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
1735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
2005b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                renderer.saveLayerAlpha(getFloat(), getFloat(), getFloat(), getFloat(),
2015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                        getInt(), getInt());
2025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2290fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
2300fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy                renderer.drawDisplayList(getDisplayList());
2310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
2494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
2524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
2584bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2604bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
2614bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
2935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
301ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase                renderer.setupColorFilter(getColorFilter());
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
3405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
3425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
3445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
347d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
3485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mShaderResources.size(); i++) {
3495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = mShaderResources.itemAt(i);
3505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mShaderResources.clear();
353d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
354d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaints.clear();
355d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mPaintMap.clear();
356d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
363b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3706b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
371b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
375b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
376b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::RestoreToCount);
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
4055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
4145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
4155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
4165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
4175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
4185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
4195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
4205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
4215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
423b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
429b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guyvoid DisplayListRenderer::drawDisplayList(DisplayList* displayList) {
4610fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
4620fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
4630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
4640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
4665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4735c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
4745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
4835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
4924bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
4935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
4984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
504b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
5105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
511b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
5124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
517b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
5194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5225c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
5254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
538b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
5425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
5435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
547b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
551ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
552ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
556b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
560b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
568