DisplayListRenderer.cpp revision 5c13d89c1332fcc499379b9064b891187b75ca32
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    }
1115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkMatrix*> &matrixResources = recorder.getMatrixResources();
1125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < matrixResources.size(); i++) {
1135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkMatrix* resource = matrixResources.itemAt(i);
1145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mMatrixResources.add(resource);
1155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
1165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkPaint*> &paintResources = recorder.getPaintResources();
1185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < paintResources.size(); i++) {
1195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* resource = paintResources.itemAt(i);
1205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mPaintResources.add(resource);
1215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
1225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkiaShader*> &shaderResources = recorder.getShaderResources();
1245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < shaderResources.size(); i++) {
1255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = shaderResources.itemAt(i);
1265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mShaderResources.add(resource);
1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeRef();
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::~DisplayList() {
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    sk_free((void*) mReader.base());
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    Caches& caches = Caches::getInstance();
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
1415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
1425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mMatrixResources.size(); i++) {
1455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkMatrix* resource = mMatrixResources.itemAt(i);
1465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mMatrixResources.clear();
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mPaintResources.size(); i++) {
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* resource = mPaintResources.itemAt(i);
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mPaintResources.clear();
1545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mShaderResources.size(); i++) {
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkiaShader* resource = mShaderResources.itemAt(i);
1565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
1575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mShaderResources.clear();
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeUnref();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::replay(OpenGLRenderer& renderer) {
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int saveCount = renderer.getSaveCount() - 1;
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        switch (mReader.readInt()) {
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;
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
2404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
2434bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
2494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
2524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
2845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase                renderer.setupShader(getShader());
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                // TODO: Implement
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPathHeap = NULL;
3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (mPathHeap) {
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap->unref();
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mPathHeap = NULL;
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
3315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
3335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
3345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
3355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
3385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mMatrixResources.size(); i++) {
3395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkMatrix* resource = mMatrixResources.itemAt(i);
3405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mMatrixResources.clear();
3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mPaintResources.size(); i++) {
3445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* resource = mPaintResources.itemAt(i);
3455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
3465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mPaintResources.clear();
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();
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
362b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
363b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3666b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
370b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
371b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
379b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::RestoreToCount);
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
4015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
422b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
4485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4555c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
4565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
457b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
4655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
4744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
4755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
4804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
486b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
4925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
493b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
4944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
499b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5045c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
505b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
520b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShader();
5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
5255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
5265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
5274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetColorFilter();
5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    // TODO: Implement
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupColorFilter(filter);
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
540b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShadow();
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
545b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
5474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupShadow(radius, dx, dy, color);
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
554