DisplayListRenderer.cpp revision 5ff9df658230d49e42c43586997a02d8e4dd417e
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",
63eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
69daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
72daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
73ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
74ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
769c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
919c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
929c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
94b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
955977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
965977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase
985977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
99d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
100d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
101d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
102d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1045977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1085977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1095977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1105977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase
112d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
113d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
114d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
115d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
116d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
11724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
11843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
119d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
12124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1225977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1275977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1282fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1291af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1301af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1311af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1322fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1385977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1395977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1405977baa1fa24125c148a72699b53e62abaf08960Chet Haase
141d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
149d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
151d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
152d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
153d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
15465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
15565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
15765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
167d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
169d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
170d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
172d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
173d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
17624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
177d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
178d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
179d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
182d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
183d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
184d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
185d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
186d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
1892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
1902fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
19965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
20004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
20165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
20265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
20365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
20465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
208ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
209ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
210ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
211ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
212ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
213ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
214ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
215ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
216ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
217ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
218ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
219ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
2205baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%sStart display list (%p)", (char*) indent + 2, this);
221ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
222ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
223ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
224ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
225ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
226ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
227ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
228ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
229ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
230ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
231ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
233ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
234ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
235ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
236ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
238ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
239ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
240ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
2415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
242ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
243ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
244ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
245ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
2465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
247ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
248ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
249ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
250ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
251ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
252ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
253ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
2545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
255ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
2565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
257ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
258ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
2675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
2745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
2795baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
2855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
2915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
2965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, regionOp);
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
3185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    displayList, width, height, level + 1);
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    layer, x, y, paint);
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, x, y, paint);
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, matrix, paint);
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
3595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
3735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
388a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
389a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
390a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
391a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
3925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
394a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, paint);
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
4525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
4595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
4665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
4735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = getInt();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
483cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
4845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
485cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                    text.text(), text.length(), count, x, y, paint, length);
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
488eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
489eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
490eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
491eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
492eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
4935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
494eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
495eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                    text.text(), text.length(), count, paint);
496eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
4985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
5245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    radius, dx, dy, color);
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
5285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
5295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
5305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
5315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
5325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
5335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
5345ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
5355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
5365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
5375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
5395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op]);
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
5455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("%sDone", (char*) indent + 2);
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
553cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level) {
554daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
555b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
556b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
557b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
558ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
559ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
560ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
561ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
562ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
563ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
564ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
565ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
566ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
567b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5689c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
569ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
570b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
5715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
5729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
573ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
5745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
575daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
576daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
577daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
578cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
579daf98e941e140e8739458126640183b9f296a2abChet Haase            }
580daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
581b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
582daf98e941e140e8739458126640183b9f296a2abChet Haase                int rendererNum = getInt();
583daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
584daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
585b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
586b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
587b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
588daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
589b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
590b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
591b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
592b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
593daf98e941e140e8739458126640183b9f296a2abChet Haase                int restoreCount = saveCount + getInt();
594daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
595daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
596b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
597b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
598b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
599daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
600daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
601daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
602daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
604daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
605daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
606daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
607daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
608b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
609b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
611daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
612daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
613daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
614daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
615daf98e941e140e8739458126640183b9f296a2abChet Haase                int alpha = getInt();
616daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
617daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
618daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
619daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
6205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
6215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
623daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
624daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
625daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
626daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
627b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
629b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
630daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
631daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
632daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
634b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
635b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
636daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
637daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
638daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
639daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
640b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
641b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
642807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
643daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
644daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
645daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
646daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
647807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
648807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
649b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
650daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
651daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
652daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
653b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
654b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
655b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
656daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
657daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
658daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
659b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
660b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
661b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
662daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
663daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
664daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
665daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
666daf98e941e140e8739458126640183b9f296a2abChet Haase                int regionOp = getInt();
667daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
668daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
669daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
670b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
671b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
673daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
6747b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
6757b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
6767b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
6777b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                    displayList, width, height, level + 1);
6787b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                needsInvalidate |= renderer.drawDisplayList(displayList, width, height,
6797b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                        dirty, level + 1);
6800fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
6810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
6826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
683daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
684daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
685daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
6865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
687daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
688daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
689daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
6906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
6916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
692b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
693daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
694daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
695daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
6965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
697daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
698daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
699daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
700b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
701b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
702b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
703daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
704daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
7055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
706daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
707daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
708daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
709b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
710b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
712daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
713daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
714daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
715daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
716daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
717daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
718daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
719daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
720daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
7215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
722daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
723daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
724daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
725b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
726b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
7275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
7285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
7295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
7305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
7315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
7325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
7335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
7345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
7355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
7365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
7375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
7385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
739daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
7415a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
742a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
743b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
744b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
745b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
7464bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
747b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
748b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
7494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
750b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
751b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
752b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
753b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
754b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
7554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
756b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
7579ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
7589ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
7599ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
7609ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
7615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
7629ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
763daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7644bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
7659ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
766b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
767b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
768b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
769daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
770daf98e941e140e8739458126640183b9f296a2abChet Haase                int xferMode = getInt();
771daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
772daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
773b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
774b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
775b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
776daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
777daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
778daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
779daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
7805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
781daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
782daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
783daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
784b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
785b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
78601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
787daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
788daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
789daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
790daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
791daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
792daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
7935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
794daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
795daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
796daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
79701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
79801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
79901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
800daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
801daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
802daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
8035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
804daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
805daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
806daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
80701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
80801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
809c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
810daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
811daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
812daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
813daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
815daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
816daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
817daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
818c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
819c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
8208b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
821daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
822daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
823daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
824daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
825daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
826daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
827daf98e941e140e8739458126640183b9f296a2abChet Haase                int i1 = getInt();
8285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
829daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
830daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
831daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
8328b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
8338b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
834b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
835daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
8365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
837daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
838daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
839b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
840b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
841b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
842b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
843b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
8445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
845daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8469ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
847b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
848b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
849ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
850ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                int count = 0;
851ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
8525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
853ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
8549ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
855ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
856ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
857b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
859daf98e941e140e8739458126640183b9f296a2abChet Haase                int count = getInt();
860daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
861daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
8625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
863cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
864cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
865cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
866cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
869eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
870eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
871eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
872eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
873eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
8745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
875eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
876eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
877eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
878eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
879eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
880b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
881daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
885b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
886daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
887daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
888daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
889b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
891b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
892daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
893b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
894b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
897daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
898daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
899daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
903daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
904b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
905b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
906b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
908daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
909daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
910daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
911daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
913daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
914daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
915daf98e941e140e8739458126640183b9f296a2abChet Haase            }
916daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
9175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
9185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
9195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
9205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
9215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
9225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
9235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
9245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
9255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
9265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
9275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
9285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
9295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
930daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
931daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
932daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
933daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
936ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
937daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
938daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
9424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
9434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
9444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
94504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), mHasDrawOps(false) {
9464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
9494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
9504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
9534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
9545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
9555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
9565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
957d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
9585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
9595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
960d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
961d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
962d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
963d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
964d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
965d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
96643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
967d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
96843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
96924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
97024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
97143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
97243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
97343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
974d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
9752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
9762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
977d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
978d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
97904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
98004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
9814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
9844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
9854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
9864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
987162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
988162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
989162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
9905977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
991162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
9925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
99304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
994162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
9955977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
9965977baa1fa24125c148a72699b53e62abaf08960Chet Haase
997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
998b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
999b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1001b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1002b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1003b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
10057d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1006b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1007b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1008b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1009b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
101027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
101127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
101227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
101327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
101427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
101527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
1016b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1017b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1018daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1019daf98e941e140e8739458126640183b9f296a2abChet Haase}
1020daf98e941e140e8739458126640183b9f296a2abChet Haase
10212b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
10224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1024cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1025cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1026daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1027daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
1028daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
1029daf98e941e140e8739458126640183b9f296a2abChet Haase}
1030daf98e941e140e8739458126640183b9f296a2abChet Haase
10314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1032b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
10334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
10344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
10354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
103804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
103904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        addOp(DisplayList::Restore);
104004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    } else {
104104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mRestoreSaveCount--;
104204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
10434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
10444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
104727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
10484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
10494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
10525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1053b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
10544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
10554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
10564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1057b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
10584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
10615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
10625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
10635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
10645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
10655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
10665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
10675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
10685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
10694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
1070b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
10714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
10724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
10734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
10774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
10784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
10794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1082b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
10834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
10844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
10854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1087807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1088807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1089807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1090807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1091807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1092807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
10934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
10954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
10974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1100b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
11014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
11024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
11034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
11064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1107b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
11084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
11104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
11114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11137b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
11147b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        uint32_t width, uint32_t height, Rect& dirty, uint32_t level) {
1115cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1116cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
11170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
11180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
11197b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
1120daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
11210fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
11220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1123ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
11246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1125ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1126ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
11276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
11286c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
11296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
11304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
11315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
11334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
11354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11385c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
11395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
11414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
11434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
11474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
11485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
1149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
11504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
11524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
11534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11565a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
11575a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
11585a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
11595a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
11605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
11615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
11625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
11635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
11645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
11655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
11665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
11675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
11685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
11695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
11705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
11715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
11724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
11734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
11745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
1175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
11764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
11774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
11784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
11794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
11804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
11864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
11874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
11884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
11915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
11934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
119701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
119801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
119901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
120001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
120101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
120201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
120301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
120401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
120501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
120601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
120701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
120801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
120901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
121001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
121101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1212c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1213c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1214c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1215c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1216c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1217c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1218c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
12198b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
12208b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
122182d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
12228b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
12238b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
12248b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
12258b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
12268b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
12278b2f5267f16c295f12faab810527cd6311997e34Romain Guy
12284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
1229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
12304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
12314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
12324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12345c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
12364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
12374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1238ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1239ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1240ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1241ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1242ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1243ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
12444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1247cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
1248726aeba80ffc6778a9bc3e0ee957b8d644183505Romain Guy    if (count <= 0) return;
1249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
12504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
12514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
12538f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
12548f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
12558f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
12568f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
12578f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
12588f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1259c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
12608f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
12614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1262cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy    addFloat(length < 0.0f ? paint->measureText(text, bytesCount) : length);
12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1265eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1266eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
1267eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    if (count <= 0) return;
1268eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1269eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1270eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1271eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1272eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1273eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1274eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1275eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
12764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
12784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
12815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
12825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
12834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
12874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1290ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1291ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
12924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
12964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
13004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
13014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
13024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
13034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
13065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
13075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
13085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
13095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
13105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
13115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
13125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
13135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
13145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
13154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
13164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1317