DisplayListRenderer.cpp revision d63cbd10765e8f48e39b07b15f0a4b70bf853ec8
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///////////////////////////////////////////////////////////////////////////////
25b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
26b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
27b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
28ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
29ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
30ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
31ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
32ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
33ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
374cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
52c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
538b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
56ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
57ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
58ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
59ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
62daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
63daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
675977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
685977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
695977baa1fa24125c148a72699b53e62abaf08960Chet Haase
705977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
71d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
72d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
73d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
74d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
755977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
765977baa1fa24125c148a72699b53e62abaf08960Chet Haase
775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
785977baa1fa24125c148a72699b53e62abaf08960Chet Haase
795977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
805977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
815977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
825977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
835977baa1fa24125c148a72699b53e62abaf08960Chet Haase
8424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
8543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
865977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
8724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
885977baa1fa24125c148a72699b53e62abaf08960Chet Haase
895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
905977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
915977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
935977baa1fa24125c148a72699b53e62abaf08960Chet Haase
942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        delete mPaths.itemAt(i);
962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1045977baa1fa24125c148a72699b53e62abaf08960Chet Haase
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
107b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
113d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
114d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
115d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
116d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
117d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
131d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
13224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
13324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
13443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        SkiaShader* shader = shaders.itemAt(i);
13543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        mShaders.add(shader);
13643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.incrementRefcount(shader);
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
139d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
140d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
141d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
142d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
143d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
1452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
1462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
1472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1482fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
149d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
150d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
151d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
152d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
158daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayList::replay(OpenGLRenderer& renderer, uint32_t level) {
159daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
163ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
164ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
165ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
166ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
167ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
168ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
169ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
170ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
171ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
173ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
1755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
176ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
178daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
179daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
180daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
181daf98e941e140e8739458126640183b9f296a2abChet Haase                needsInvalidate |= renderer.callDrawGLFunction(functor);
182daf98e941e140e8739458126640183b9f296a2abChet Haase            }
183daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
185daf98e941e140e8739458126640183b9f296a2abChet Haase                int rendererNum = getInt();
186daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
187daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
191daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
196daf98e941e140e8739458126640183b9f296a2abChet Haase                int restoreCount = saveCount + getInt();
197daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
198daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
202daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
203daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
204daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
205daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
206daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
207daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
208daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
209daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
210daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
214daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
215daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
216daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
217daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
218daf98e941e140e8739458126640183b9f296a2abChet Haase                int alpha = getInt();
219daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
220daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
221daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
222daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
2235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
2245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
226daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
227daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
228daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
229daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
233daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
234daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
235daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
239daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
240daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
241daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
242daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
245807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
246daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
247daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
248daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
249daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
250807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
251807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
253daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
254daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
255daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
259daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
260daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
261daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
265daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
266daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
267daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
268daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
269daf98e941e140e8739458126640183b9f296a2abChet Haase                int regionOp = getInt();
270daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
271daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
272daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
2750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
276daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
277daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %d", (char*) indent, OP_NAMES[op],
278daf98e941e140e8739458126640183b9f296a2abChet Haase                    displayList, level + 1);
279daf98e941e140e8739458126640183b9f296a2abChet Haase                needsInvalidate |= renderer.drawDisplayList(displayList, level + 1);
2800fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
2810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
2826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
283daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
284daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
285daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
286daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
287daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
288daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
289daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
2906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
2916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
293daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
294daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
295daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
296daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
297daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
298daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
299daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
303daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
304daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
305daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
306daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
307daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
308daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
312daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
313daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
314daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
315daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
316daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
317daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
318daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
319daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
320daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
321daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
322daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
323daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
324daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
3275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
3285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
3295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
3305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
3315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
3325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
3335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
3345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
3355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
3365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
3375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
338daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
3395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
3405a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
341a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
3454bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
3484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
349b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
3544bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
355b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
356daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
3574bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
3584bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
362daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
363daf98e941e140e8739458126640183b9f296a2abChet Haase                int xferMode = getInt();
364daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
365daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
369daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
370daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
371daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
372daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
373daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
374daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
375daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
376daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
37901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
380daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
381daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
382daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
383daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
384daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
385daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
386daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
387daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
388daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
389daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
39001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
39101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
39201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
393daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
394daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
395daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
396daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
397daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
398daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
399daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
40001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
40101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
402c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
403daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
404daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
405daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
406daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
407daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
408daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
409daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
410daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
411c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
412c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
4138b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
414daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
415daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
416daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
417daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
418daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
419daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
420daf98e941e140e8739458126640183b9f296a2abChet Haase                int i1 = getInt();
421daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
422daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
423daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
424daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
4258b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
4268b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
428daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
429daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
430daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
431daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
437daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
442b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
443daf98e941e140e8739458126640183b9f296a2abChet Haase                int count = getInt();
444daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
445daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
446daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
447daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
448daf98e941e140e8739458126640183b9f296a2abChet Haase                    text.text(), text.length(), count, x, y, paint);
449daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawText(text.text(), text.length(), count, x, y, paint);
450b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
451b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
452b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
453daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
456b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
457b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
458daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
459daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
460daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
464daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
469daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
470daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
471daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
472b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
473b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
474b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
475daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
480daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
481daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
482daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
483daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
484daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
485daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
486daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
487daf98e941e140e8739458126640183b9f296a2abChet Haase            }
488daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
489daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
490daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
491daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
492daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
493b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
495ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
496daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
497daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
498b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
499b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
500b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5042fc941e4650d618ff6e122f28b616d9032ffa134Romain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE) {
5055977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
5145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
5155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
5165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
5175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
5185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
5195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
5205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
521d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
52243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
52343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
52443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
52524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
52624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
52743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
52843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
52943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
5302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
5312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
532d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
5334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
5374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5395977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
5405977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
5415977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
5425977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
543d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        mDisplayList->initFromDisplayListRenderer(*this, true);
5445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
5455977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
5465977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
5475977baa1fa24125c148a72699b53e62abaf08960Chet Haase
548b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
549b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
550b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
551b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
552b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
553b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
554b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5557d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
5567d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
557b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
558b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
559b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
560b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
56127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
56227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
56327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
56427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
56527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
56627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
567b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
568b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
569daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
570daf98e941e140e8739458126640183b9f296a2abChet Haase}
571daf98e941e140e8739458126640183b9f296a2abChet Haase
5722b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
575daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayListRenderer::callDrawGLFunction(Functor *functor) {
576daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
577daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
578daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
579daf98e941e140e8739458126640183b9f296a2abChet Haase}
580daf98e941e140e8739458126640183b9f296a2abChet Haase
5814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
582b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
5834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
5844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
588b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
5894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
5904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
59327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
5944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
5954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
5985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
599b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
6004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
603b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
6044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
6075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
6085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
6095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
6105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
6115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
6125b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
6135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
6145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
6154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
616b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
6174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
6184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
6194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
6234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
6244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
6254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
6294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
6304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
6314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
633807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
634807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
635807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
636807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
637807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
638807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
6394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
640b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
6414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
6424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
6434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
646b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
6474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
6484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
6494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
6524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
653b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
6544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
6554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
6564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
6574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
659daf98e941e140e8739458126640183b9f296a2abChet Haasebool DisplayListRenderer::drawDisplayList(DisplayList* displayList, uint32_t level) {
6600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
6610fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
662daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
6630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
6640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
665ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
6666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
667ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
668ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
6696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
6706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
6716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
6724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
6735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
674b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
6754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
6774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6805c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
6815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
682b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
6834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
6854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
6905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
691b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
6924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
6934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
6944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
6995a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
7005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
7015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
7025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
7035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
7045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
7055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
7065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
7075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
7085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
7095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
7105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
7115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
7125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
7135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
7154bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
7165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
717b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
7214bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
727b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
7284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
7294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
7335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
73901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
74001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
74101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
74201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
74301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
74401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
74501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
74601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
74701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
74801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
74901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
75001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
75101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
75201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
75301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
754c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
755c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
756c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
757c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
758c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
759c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
760c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
7618b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
7628b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
76382d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
7648b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
7658b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
7668b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
7678b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
7688b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
7698b2f5267f16c295f12faab810527cd6311997e34Romain Guy
7704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
771b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
7724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
7734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7765c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
777b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
7784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
7794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
7834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
784b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
7854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
7864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
7874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
7884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
7894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
7934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
7965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
7975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
7984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
7994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
801b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
8024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
805ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
806ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
8074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
810b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
8114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
814b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
8154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
8164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
8174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
8184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
8214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
822