DisplayListRenderer.cpp revision 4bb942083a0d4db746adf95349108dd8ef842e32
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
103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkTDArray<const SkFlatBitmap*>& bitmaps = recorder.getBitmaps();
104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mBitmapCount = bitmaps.count();
105b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (mBitmapCount > 0) {
106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mBitmaps = new SkBitmap[mBitmapCount];
107b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        for (const SkFlatBitmap** flatBitmapPtr = bitmaps.begin();
108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                flatBitmapPtr != bitmaps.end(); flatBitmapPtr++) {
109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            const SkFlatBitmap* flatBitmap = *flatBitmapPtr;
110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            int index = flatBitmap->index() - 1;
111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            flatBitmap->unflatten(&mBitmaps[index], &mRCPlayback);
112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkTDArray<const SkFlatMatrix*>& matrices = recorder.getMatrices();
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mMatrixCount = matrices.count();
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (mMatrixCount > 0) {
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mMatrices = new SkMatrix[mMatrixCount];
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        for (const SkFlatMatrix** matrixPtr = matrices.begin();
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                matrixPtr != matrices.end(); matrixPtr++) {
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            const SkFlatMatrix* flatMatrix = *matrixPtr;
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            flatMatrix->unflatten(&mMatrices[flatMatrix->index() - 1]);
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkTDArray<const SkFlatPaint*>& paints = recorder.getPaints();
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPaintCount = paints.count();
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (mPaintCount > 0) {
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mPaints = new SkPaint[mPaintCount];
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        for (const SkFlatPaint** flatPaintPtr = paints.begin();
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                flatPaintPtr != paints.end(); flatPaintPtr++) {
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            const SkFlatPaint* flatPaint = *flatPaintPtr;
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            int index = flatPaint->index() - 1;
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            flatPaint->unflatten(&mPaints[index], &mRCPlayback, &mTFPlayback);
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = recorder.mPathHeap;
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeRef();
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::~DisplayList() {
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    sk_free((void*) mReader.base());
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    Caches& caches = Caches::getInstance();
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    for (int i = 0; i < mBitmapCount; i++) {
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        caches.textureCache.remove(&mBitmaps[i]);
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    delete[] mBitmaps;
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    delete[] mMatrices;
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    delete[] mPaints;
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap->safeUnref();
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mBitmaps = NULL;
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mMatrices = NULL;
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPaints = NULL;
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mPathHeap = NULL;
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mBitmapCount = mMatrixCount = mPaintCount = 0;
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()) {
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        switch (mReader.readInt()) {
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case AcquireContext: {
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.acquireContext();
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ReleaseContext: {
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.releaseContext();
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.save(getInt());
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restoreToCount(saveCount + getInt());
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.saveLayer(getFloat(), getFloat(), getFloat(), getFloat(),
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getPaint(), getInt());
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.translate(getFloat(), getFloat());
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.rotate(getFloat());
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.scale(getFloat(), getFloat());
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setMatrix(getMatrix());
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.concatMatrix(getMatrix());
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.clipRect(getFloat(), getFloat(), getFloat(), getFloat(),
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        (SkRegion::Op) getInt());
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getPaint());
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getMatrix(), getPaint());
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawBitmap(getBitmap(), getFloat(), getFloat(), getFloat(), getFloat(),
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
2394bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
2424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
2484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
2514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawColor(getInt(), (SkXfermode::Mode) getInt());
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawRect(getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawPath(getPath(), getPaint());
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawText(text.text(), text.length(), getInt(),
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                        getFloat(), getFloat(), getPaint());
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                // TODO: Implement
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                // TODO: Implement
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.setupShadow(getFloat(), getFloat(), getFloat(), getInt());
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::DisplayListRenderer():
3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mHeap(HEAP_BLOCK_SIZE), mWriter(MIN_WRITER_SIZE) {
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mBitmapIndex = mMatrixIndex = mPaintIndex = 1;
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    mBitmaps.reset();
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mMatrices.reset();
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mPaints.reset();
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mHeap.reset();
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mRCRecorder.reset();
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mTFRecorder.reset();
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3486b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guyvoid DisplayListRenderer::prepare(bool opaque) {
349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
354b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::acquireContext() {
356b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::AcquireContext);
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::acquireContext();
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::releaseContext() {
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ReleaseContext);
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::releaseContext();
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::RestoreToCount);
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(saveCount);
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* p, int flags) {
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
423b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, const SkMatrix* matrix,
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float dstRight, float dstBottom, const SkPaint* paint) {
448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
4564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
4574bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        float left, float top, float right, float bottom, const SkPaint* paint) {
458b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
4624bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        const SkPaint* paint) {
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawLines(float* points, int count, const SkPaint* paint) {
487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
4974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
4984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
4994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
502b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShader();
5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    // TODO: Implement
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupShader(shader);
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetColorFilter();
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
5174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    // TODO: Implement
5184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupColorFilter(filter);
5194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::resetShadow();
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
5284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
5304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
5314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setupShadow(radius, dx, dy, color);
5324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Recording management
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatPaint*>& paints, const SkPaint* paint) {
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (paint == NULL) {
5404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return 0;
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatPaint* flat = SkFlatPaint::Flatten(&mHeap, *paint, mPaintIndex,
5444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            &mRCRecorder, &mTFRecorder);
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) paints.begin(),
5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            paints.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
5474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return paints[index]->index();
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
5534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *paints.insert(index) = flat;
5544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mPaintIndex++;
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatMatrix*>& matrices, const SkMatrix* matrix) {
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (matrix == NULL) {
5594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return 0;
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatMatrix* flat = SkFlatMatrix::Flatten(&mHeap, *matrix, mMatrixIndex);
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) matrices.begin(),
5644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            matrices.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
5664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return matrices[index]->index();
5684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
5704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *matrices.insert(index) = flat;
5714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mMatrixIndex++;
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::find(SkTDArray<const SkFlatBitmap*>& bitmaps, const SkBitmap& bitmap) {
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkFlatBitmap* flat = SkFlatBitmap::Flatten(&mHeap, bitmap, mBitmapIndex, &mRCRecorder);
5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int index = SkTSearch<SkFlatData>((const SkFlatData**) bitmaps.begin(),
5774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            bitmaps.count(), (SkFlatData*) flat, sizeof(flat), &SkFlatData::Compare);
5784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (index >= 0) {
5794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        (void) mHeap.unalloc(flat);
5804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return bitmaps[index]->index();
5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    index = ~index;
5834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    *bitmaps.insert(index) = flat;
5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return mBitmapIndex++;
5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
589