DisplayListRenderer.cpp revision 8f9a9f61ab793d9387a5942b307e74324704893b
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 <utils/String8.h>
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
30b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
33ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
424cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
515a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
57c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
588b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
59ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
61ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
68daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
69daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
769c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
7765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
7965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
8665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
889c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
899c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
909c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
91b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
935977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
945977baa1fa24125c148a72699b53e62abaf08960Chet Haase
955977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
96d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
97d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
98d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
99d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1045977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1085977baa1fa24125c148a72699b53e62abaf08960Chet Haase
109d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
110d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
111d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
112d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
113d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
11424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
11543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
116d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
11824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1215977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1225977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1252fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1261af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1271af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1281af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase
138d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
146d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
147d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
148d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
149d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
15165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
15265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
15465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
164d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
169d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
170d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
17324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
175d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
176d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
179d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
180d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
181d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
182d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
183d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
189d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
190d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
191d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
19665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
19704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
19865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
19965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
20065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
20165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
204ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
205ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
206ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
207ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
208ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
209ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
210ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
211ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
212ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
213ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
214ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
215ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
216ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
217ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    LOGD("%sStart display list (%p)", (char*) indent + 2, this);
218ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
219ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
220ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
221ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
222ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
223ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
224ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
225ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
226ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
227ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
228ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
229ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
230ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
231ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
232ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
233ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
234ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
235ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
236ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
237ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
238ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
239ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
240ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
241ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
242ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
243ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
244ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
245ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
246ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
247ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
248ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
249ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
250ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
251ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
252ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
253ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
254ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
255ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
256ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
257ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
258ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
285ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, regionOp);
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    displayList, width, height, level + 1);
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    layer, x, y, paint);
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, x, y, paint);
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, matrix, paint);
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
385a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
386a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
387a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
388a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
389a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                SkPaint* paint = getPaint();
390a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                LOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
391a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, paint);
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %p",
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = getInt();
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
480cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
481cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
482cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                    text.text(), text.length(), count, x, y, paint, length);
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    radius, dx, dy, color);
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("Display List error: op not handled: %s%s",
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op]);
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    LOGD("%sDone", (char*) indent + 2);
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
531cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level) {
532daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
533b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
534b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
536ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
537ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
538ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
539ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
540ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
541ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
542ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
543ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
544ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
545b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5469c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
547ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
548b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
5495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
5509c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
551ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
5525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
553daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
554daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
555daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
556cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
557daf98e941e140e8739458126640183b9f296a2abChet Haase            }
558daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
559b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
560daf98e941e140e8739458126640183b9f296a2abChet Haase                int rendererNum = getInt();
561daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
562daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
563b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
564b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
565b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
566daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
567b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
568b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
569b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
570b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
571daf98e941e140e8739458126640183b9f296a2abChet Haase                int restoreCount = saveCount + getInt();
572daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
573daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
574b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
575b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
576b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
577daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
578daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
579daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
580daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
581daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
582daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
583daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
584daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
585daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
586b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
587b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
5885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
589daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
590daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
591daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
592daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
593daf98e941e140e8739458126640183b9f296a2abChet Haase                int alpha = getInt();
594daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
595daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
596daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
597daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
5985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
5995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
600b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
601daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
602daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
603daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
604daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
605b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
606b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
607b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
608daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
609daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
610daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
611b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
612b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
614daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
615daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
616daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
617daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
618b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
619b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
620807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
621daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
622daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
623daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
624daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
625807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
626807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
627b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
628daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
629daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
630daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
631b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
634daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
635daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
636daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
637b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
638b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
639b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
640daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
641daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
642daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
643daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
644daf98e941e140e8739458126640183b9f296a2abChet Haase                int regionOp = getInt();
645daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
646daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
647daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
648b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
649b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
651daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
6527b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
6537b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
6547b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
6557b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                    displayList, width, height, level + 1);
6567b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                needsInvalidate |= renderer.drawDisplayList(displayList, width, height,
6577b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                        dirty, level + 1);
6580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
6590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
6606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
661daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
662daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
663daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
664daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
665daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
666daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
667daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
6686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
6696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
670b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
671daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
672daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
673daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
674daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
675daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
676daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
677daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
678b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
679b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
680b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
681daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
682daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
683daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
684daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
685daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
686daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
687b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
688b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
689b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
690daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
691daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
692daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
693daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
694daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
695daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
696daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
697daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
698daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
699daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
700daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
701daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
702daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
703b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
704b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
7055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
7065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
7075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
7085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
7095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
7105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
7115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
7125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
7135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
7145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
7159ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                SkPaint* paint = getPaint();
7165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
717daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7189ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
7195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
720a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
721b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
722b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
723b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
7244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
725b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
726b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
7274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
728b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
729b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
730b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
731b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
732b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
7334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
7359ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
7369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
7379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
7389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
7399ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                SkPaint* paint = getPaint();
7409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
741daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
7439ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
744b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
745b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
746b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
747daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
748daf98e941e140e8739458126640183b9f296a2abChet Haase                int xferMode = getInt();
749daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
750daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
751b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
752b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
753b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
754daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
755daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
756daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
757daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
758daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
759daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
760daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
761daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
762b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
763b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
76401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
765daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
766daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
767daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
768daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
769daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
770daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
771daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
772daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
773daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
774daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
77501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
77601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
77701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
778daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
779daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
780daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
781daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
782daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
783daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
784daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
78501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
78601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
787c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
788daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
789daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
790daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
791daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
792daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
793daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
794daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
795daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
796c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
797c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
7988b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
799daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
800daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
801daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
802daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
803daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
804daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
805daf98e941e140e8739458126640183b9f296a2abChet Haase                int i1 = getInt();
806daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
807daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
808daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
809daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
8108b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
8118b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
812b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
813daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
814daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
815daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
816daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
818b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
819b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
820b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
821b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
8229ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                SkPaint* paint = getPaint();
823daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8249ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
825b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
827ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
828ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                int count = 0;
829ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
8309ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                SkPaint* paint = getPaint();
831ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8329ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
833ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
834ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
835b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
837daf98e941e140e8739458126640183b9f296a2abChet Haase                int count = getInt();
838daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
839daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
840daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
841cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
842cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
843cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
844cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
845b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
846b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
847b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
848daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
849b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
850b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
851b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
852b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
853daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
854daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
855daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
856b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
857b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
859daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
860b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
861b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
862b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
863b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
864daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
865daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
866daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
869b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
870daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
871b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
872b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
873b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
874b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
875daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
876daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
877daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
878daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
879daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
880daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
881daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
882daf98e941e140e8739458126640183b9f296a2abChet Haase            }
883daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
884daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
885daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
886daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
887daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
888b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
889b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
890ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
891daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
892daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
893b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
894b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
8964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
8974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
8984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
89904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), mHasDrawOps(false) {
9004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
9034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
9044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
9074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
9085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
9095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
9105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
911d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
9125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
9135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
914d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
915d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
916d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
917d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
918d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
919d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
92043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
921d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
92243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
92324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
92424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
92543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
92643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
92743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
928d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
9292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
9302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
931d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
932d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
93304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
93404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
9354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
9384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
9394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
9404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
941162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
942162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
943162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
9445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
945162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
9465977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
94704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
948162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
9495977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
9505977baa1fa24125c148a72699b53e62abaf08960Chet Haase
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
952b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
953b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
954b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
955b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
9587d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
9597d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
960b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
961b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
96427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
96527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
96627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
96727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
96827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
96927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
970b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
971b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
972daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
973daf98e941e140e8739458126640183b9f296a2abChet Haase}
974daf98e941e140e8739458126640183b9f296a2abChet Haase
9752b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
9764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
978cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
979cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
980daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
981daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
982daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
983daf98e941e140e8739458126640183b9f296a2abChet Haase}
984daf98e941e140e8739458126640183b9f296a2abChet Haase
9854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
9874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
9884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
9894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
99204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
99304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        addOp(DisplayList::Restore);
99404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    } else {
99504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mRestoreSaveCount--;
99604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
9974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
9984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
100127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
10024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
10034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
10065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1007b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
10084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
10094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
10104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1011b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
10124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10145b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
10155b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
10165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
10175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
10185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
10195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
10205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
10215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
10225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
10234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
1024b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
10254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
10264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
10274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
10314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
10324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
10334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1036b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
10374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
10384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
10394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1041807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1042807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1043807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1044807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1045807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1046807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
10474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
10494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
10514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1054b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
10554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
10574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
10604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1061b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
10624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
10634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
10644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
10654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10677b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
10687b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        uint32_t width, uint32_t height, Rect& dirty, uint32_t level) {
1069cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1070cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
10710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
10720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
10737b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
1074daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
10750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
10760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1077ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
10786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1079ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1080ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
10816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
10826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
10836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
10844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
10855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1086b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
10874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
10894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10925c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
10935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
10954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
11014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
11025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
1103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
11044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
11064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
11074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
11115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
11125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
11135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
11145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
11155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
11165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
11175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
11185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
11195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
11205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
11215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
11225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
11235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
11245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
11255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
11264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
11274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
11285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
1129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
11304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
11324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
11334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
11344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
11404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
11414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
11424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
11455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
11474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
115101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
115201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
115301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
115401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
115501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
115601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
115701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
115801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
115901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
116001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
116101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
116201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
116301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
116401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
116501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1166c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1167c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1168c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1169c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1170c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1171c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1172c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
11738b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
11748b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
117582d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
11768b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
11778b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
11788b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
11798b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
11808b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
11818b2f5267f16c295f12faab810527cd6311997e34Romain Guy
11824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
1183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
11844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
11854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11885c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
11904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
11914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1192ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1193ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1194ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1195ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1196ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1197ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
11984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1201cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
1202726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    if (count <= 0) return;
1203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
12044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
12054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
12064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
12078f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
12088f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
12098f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
12108f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
12118f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
12128f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
12138f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
12148f9a9f61ab793d9387a5942b307e74324704893bRomain Guy#if RENDER_TEXT_AS_GLYPHS
12158f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setTextEncoding(SkPaint::kGlyphID_TextEncoding);
12168f9a9f61ab793d9387a5942b307e74324704893bRomain Guy#endif
12174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1218cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy    addFloat(length < 0.0f ? paint->measureText(text, bytesCount) : length);
12194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
12234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
12265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
12275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
12284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
12324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1235ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1236ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
12374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
12414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
12454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
12464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
12484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
12514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1252