DisplayListRenderer.cpp revision bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3
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
199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
229c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2413631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <utils/String8.h>
2513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
525a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
58c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
62ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
71daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
74daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
75ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
96b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
985977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1005977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
101d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
102d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
103d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
104bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
105bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
106bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
107bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
108bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
109bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
110bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
111d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1125977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1145977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1155977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase
121d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
122d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
123d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
124d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
125d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
12743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
128d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
13024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1381af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1391af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1401af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase
150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
158d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
159d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
160d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
161d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
162d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
16365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
16465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
16665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
176d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
177d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
178d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
179d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
180d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
181d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
182d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
183d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
18424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
18524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
186d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
187d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
188d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
191d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
1972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
1982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
1992fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
201d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
203d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
204d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
20904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
21165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
21265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
21365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
216ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
217ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
218ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
219ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
220ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
221ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
222ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
223ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
224ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
225ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
226ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
227ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
228ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
22913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
230ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
231ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
232ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
233ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
234ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
235ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
236ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
23733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
23833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
23933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
24033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
24133f6beb10f98e8ba96250e284876d607055d278dRomain Guy       }
242ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
243ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
244ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
245ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
247ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
248ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
249ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
250ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
252ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
253ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
254ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
2555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
256ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
257ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
258ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
2605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
2685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
2705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
2815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
285ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
2885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
2935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
2995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, regionOp);
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
33233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
33333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
33433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                    displayList, width, height, flags, level + 1);
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    layer, x, y, paint);
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, x, y, paint);
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, matrix, paint);
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
3745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
3885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
403a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
404a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
405a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
406a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
409a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, paint);
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
4675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4685baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
4745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
4815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
4885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
494325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
498cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
4995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
500cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                    text.text(), text.length(), count, x, y, paint, length);
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
503325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
504325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
505325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
506325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
507325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
508325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
509325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
510325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
511325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
512325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
513325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
514eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
515eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
516eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
517eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
518eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
520eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
521eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                    text.text(), text.length(), count, paint);
522eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
5505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    radius, dx, dy, color);
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
5555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
5565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
5585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
5595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
5605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
5615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
5625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
564ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op]);
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
5715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%sDone", (char*) indent + 2);
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
57933f6beb10f98e8ba96250e284876d607055d278dRomain Guybool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
580daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
581b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
582b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
583b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
584ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
585ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
586ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
587ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
588ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
589ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
590ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
59113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
592ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
593b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
59413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
59513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
5969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
597ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
598b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
5995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
60033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
60133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int32_t skip = mReader.readInt() * 4;
60233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
60333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
60433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
60533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
60633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
60733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
60833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
60933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
61033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
6119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
612ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
6135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
614daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
615daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
616daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
61713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
618cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
61913631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
620daf98e941e140e8739458126640183b9f296a2abChet Haase            }
621daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
62333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
624daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
625daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
626b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
627b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
629daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
630b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
631b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
63433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
635daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
636daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
637b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
638b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
639b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
640daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
641daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
642daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
643daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
6445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
64533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
646daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
647daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
648daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
649b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
650b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
652daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
653daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
654daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
655daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
658daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
659daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
660daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
6615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
6625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
663b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
664daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
665daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
666daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
667daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
668b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
669b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
670b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
671daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
672daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
673daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
674b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
675b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
676b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
677daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
678daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
679daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
680daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
681b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
682b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
683807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
684daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
685daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
686daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
687daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
688807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
689807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
690b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
691daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
692daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
693daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
694b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
695b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
696b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
697daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
698daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
699daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
700b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
701b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
702b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
703daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
704daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
705daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
706daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
70733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
708daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
709daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
710daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
712b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
7130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
714daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
7157b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
7167b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
71733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
71833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
71933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                    displayList, width, height, flags, level + 1);
7207b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                needsInvalidate |= renderer.drawDisplayList(displayList, width, height,
72133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        dirty, flags, level + 1);
7220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
7230fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
7246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
725daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
726daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
727daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
7285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
729daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
730daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
731daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
7326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
7336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
735daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
736daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
737daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
7385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
739daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
740daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
741daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
742b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
743b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
744b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
745daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
746daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
7475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
748daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
749daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
750daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
751b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
752b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
753b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
754daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
755daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
756daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
757daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
758daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
759daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
760daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
761daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
762daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
7635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
764daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
765daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
766daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
767b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
768b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
7695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
77033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
7715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
7725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
7735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
7745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
7755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
7765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
7775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
77833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
7795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
7805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
781daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7829ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
7835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
784a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
785b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
786b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
787b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
7884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
789b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
790b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
7914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
793b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
794b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
795b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
796b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
7974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
798b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
7999ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
8009ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
8019ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
8029ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
8035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
8049ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
805daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
8079ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
808b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
809b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
810b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
81133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
81233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
813daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
814daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
815b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
816b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
818daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
819daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
820daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
821daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
823daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
824daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
825daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
827b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
82801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
829daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
830daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
831daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
832daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
833daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
834daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
8355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
836daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
837daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
838daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
83901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
84001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
84101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
842daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
843daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
844daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
8455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
846daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
847daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
848daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
84901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
85001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
851c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
852daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
853daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
854daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
855daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
857daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
858daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
859daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
860c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
861c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
8628b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
863daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
864daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
865daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
866daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
867daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
868daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
86933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
8705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
871daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
872daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
873daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
8748b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
8758b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
877daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
8785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
879daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
880daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
881b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
885b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
8865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
887daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8889ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
889b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
891ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
89233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
893ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
8945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
895ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8969ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
897ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
898ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
899b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
90133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
902daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
903daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
905cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
906cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
907cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
908cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
911325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
912325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
913325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
914325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
915325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
916325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
917325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
918325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
919325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
920325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
921325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
922325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
923325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
924eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
925eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
92633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
92733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
928eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
9295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
930eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
931eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
932eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
933eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
934eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
936daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
941daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
942daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
943daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
946b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
947daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
948b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
949b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
952daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
953daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
954daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
955b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
958daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
959b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
960b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
961b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
963daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
964daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
965daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
96633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
967daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
968daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
969daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
970daf98e941e140e8739458126640183b9f296a2abChet Haase            }
971daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
9725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
9735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
9745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
9755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
9765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
9775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
97833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
97933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
9805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
9815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
9825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
9835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
9845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
985daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
986daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
987daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
988daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
990b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
991ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
99213631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
99313631f3da855f200a151e7837ed9f6b079622b58Romain Guy
994daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
995daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
996b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
998b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
9994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
10004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
10014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
100233f6beb10f98e8ba96250e284876d607055d278dRomain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE),
100333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
10044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
10074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
10084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
10114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
10125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
10135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
10145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1015d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
10165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
10175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1018d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1019d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1020d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1021d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1022d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1023d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
102443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1025d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
102643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
102724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
102824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
102943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
103043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
103143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1032d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
10332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
10342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1035d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1036d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
103704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
103804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
10394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
10424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
10434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
10444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1045162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1046162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1047162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
10485977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1049162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
10505977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
105104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1052162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
10535977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
10545977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1055b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1056b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1057b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1058b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1059b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1060b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1061b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10627d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
10637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1065b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1067b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
106827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
106927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
107027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
107127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
107227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
107333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
107427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1077daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1078daf98e941e140e8739458126640183b9f296a2abChet Haase}
1079daf98e941e140e8739458126640183b9f296a2abChet Haase
10802b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
10814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1083cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1084cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1085daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1086daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
1087daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
1088daf98e941e140e8739458126640183b9f296a2abChet Haase}
1089daf98e941e140e8739458126640183b9f296a2abChet Haase
10904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1091b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
10924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
10934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
10944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
109704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
109833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
109933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
110004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
110133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
110233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
110333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
11044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
11054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
110827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
110933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
11104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
11114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
11145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
11164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
11184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
11204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
11235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
11245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
11255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
11265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
11275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
11285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
11295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
11305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
11314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
113233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
113333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
113433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
113533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
11364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
11374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
11414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
11424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
11434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
11474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
11484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
11494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1151807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1152807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1153807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1154807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1155807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1156807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
11574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
11594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
11604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
11614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
11654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
11664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
11674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
11704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
11724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
11744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
11754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11777b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
117833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
1179cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1180cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
118133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(0.0f, 0.0f, width, height);
118233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawDisplayList, reject);
11830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
11847b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
118533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
118633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1187daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
11880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
11890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1190ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
11916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1192ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1193ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
11946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
11956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
11966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
119733f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
119833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
119933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
12004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
12014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
12024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
120333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
12044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
120633f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
120733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
120833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
120933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
121033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
121133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
121233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
12134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
12144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
12154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
121633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
12174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
12204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
12215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
122233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
122333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
12244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
12254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
12264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
12274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
122833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
12294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
12325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
12335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
12345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
12355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
12365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
12375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
12385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
12395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
12405a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
12415a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
12425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
12435a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
12445a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
12455a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
12465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
12484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
12495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
125033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
125133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
12534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
12544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
12554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
12564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
12574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
125833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
12594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
12654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
12685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
126933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
127033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
127133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
12724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
12734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
127433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
12754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
127701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
127801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
127933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
128033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
128133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
128201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
128301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
128401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
128533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
128601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
128701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
128801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
128901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
129001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
129101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
129201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
129301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
129401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1295c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1296c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1297c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1298c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1299c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1300c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1301c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
13028b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
13038b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
130482d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
13058b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
13068b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
13078b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
13088b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
13098b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
13108b2f5267f16c295f12faab810527cd6311997e34Romain Guy
13114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
131233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
131333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
131433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
131533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
131633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
131733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
13184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
13194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
132033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
13214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13235c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
13254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
13264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1327ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1328ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1329ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1330ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1331ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1332ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
13334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1336cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
133733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
133833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
13398f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
13408f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
13418f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
13428f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
13438f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
13448f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1345c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
13468f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
134733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
134833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
134933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
135033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
135133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
135233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
135333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
135433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
135533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
135633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
135733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
135833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
135933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
136133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
136233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1365325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1366325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1367325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1368325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1369325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1370325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1371325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1372325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1373325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1374325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1375325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1376325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1377325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1378eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1379eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
138033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1381eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1382eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1383eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1384eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1385eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1386eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1387eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1388eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
13914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
13945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
13955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
13964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1403ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1404ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
14195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
14205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
14215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
14225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
14235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
14245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
14255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
14265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
14275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1430