DisplayListRenderer.cpp revision ed30fd8e9a2d65ee5c8520de55b0089c219f390c
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
229c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include <utils/String8.h>
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
289c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
30b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
33ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
424cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
515a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
57c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
588b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
59ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
61ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
68daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
69daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
729c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
739c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
749c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
769c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    String8 cachesLog;
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    Caches::getInstance().dumpMemoryUsage(cachesLog);
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nCaches:\n%s", cachesLog.string());
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
875977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
885977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
895977baa1fa24125c148a72699b53e62abaf08960Chet Haase
905977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
91d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
92d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
93d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
94d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
955977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
965977baa1fa24125c148a72699b53e62abaf08960Chet Haase
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
985977baa1fa24125c148a72699b53e62abaf08960Chet Haase
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase
10424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
10543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
10724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1085977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1095977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1105977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1125977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1142fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1151af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1161af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1171af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1182fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1192fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1202fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1215977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1225977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1235977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1245977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase
127d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
135d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
136d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
137d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
138d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
139d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    size_t size = writer.size();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void* buffer = sk_malloc_throw(size);
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.setMemory(buffer, size);
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
1485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
153d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
15424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
15524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
15643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        SkiaShader* shader = shaders.itemAt(i);
15743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        mShaders.add(shader);
15843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.incrementRefcount(shader);
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
161d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
162d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
163d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
164d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
165d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1662fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
1672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
1682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
1692fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1702fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
171d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
172d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
173d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
174d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
180ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
181ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
182ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
183ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
184ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
185ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
186ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
187ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
188ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
189ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
190ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
191ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
192ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
193ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    LOGD("%sStart display list (%p)", (char*) indent + 2, this);
194ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
195ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
196ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
197ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
198ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
199ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
200ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
201ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
202ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
203ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
204ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
205ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
206ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
207ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
208ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
209ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
210ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
211ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
212ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
213ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
214ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
215ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
216ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
217ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
218ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
219ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
220ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
221ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
222ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
223ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
224ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
225ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
226ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
227ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
228ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
229ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
230ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
231ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
232ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
233ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
234ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
235ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
236ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
237ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
238ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
239ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
240ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
241ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
242ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
243ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
244ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
245ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
246ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
247ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
248ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
249ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
250ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
251ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
252ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
253ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
254ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
255ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
256ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
257ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
258ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, regionOp);
285ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    displayList, width, height, level + 1);
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    layer, x, y, paint);
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, x, y, paint);
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    bitmap, matrix, paint);
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getFloat();
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getFloat();
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getFloat();
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getFloat();
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getPaint();
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    f1, f2, f3, f4, paint);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %p",
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = getInt();
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPaint* paint = getPaint();
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    text.text(), text.length(), count, x, y, paint);
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s", (char*) indent, OP_NAMES[op]);
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    radius, dx, dy, color);
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                LOGD("Display List error: op not handled: %s%s",
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                    (char*) indent, OP_NAMES[op]);
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    LOGD("%sDone", (char*) indent + 2);
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
505cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level) {
506daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
507b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
508b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
509b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
510ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
511ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
512ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
513ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
514ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
515ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
516ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
517ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p)", (char*) indent + 2, this);
518ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
521ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
5235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
5249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
525ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
5265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
527daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
528daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
529daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
530cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
531daf98e941e140e8739458126640183b9f296a2abChet Haase            }
532daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
533b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
534daf98e941e140e8739458126640183b9f296a2abChet Haase                int rendererNum = getInt();
535daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
536daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
537b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
538b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
539b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
540daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
541b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
542b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
543b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
544b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
545daf98e941e140e8739458126640183b9f296a2abChet Haase                int restoreCount = saveCount + getInt();
546daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
547daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
548b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
549b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
550b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
551daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
552daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
553daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
554daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
555daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
556daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
557daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
558daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, paint, flags);
559daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
560b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
561b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
5625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
563daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
564daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
565daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
566daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
567daf98e941e140e8739458126640183b9f296a2abChet Haase                int alpha = getInt();
568daf98e941e140e8739458126640183b9f296a2abChet Haase                int flags = getInt();
569daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
570daf98e941e140e8739458126640183b9f296a2abChet Haase                    OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
571daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
5725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
5735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
574b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
575daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
576daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
577daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
578daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
579b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
580b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
581b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
582daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
583daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
584daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
585b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
586b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
587b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
588daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
589daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
590daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
591daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
592b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
593b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
594807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
595daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
596daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
597daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
598daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
599807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
600807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
601b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
602daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
603daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
604daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
605b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
606b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
607b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
608daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
609daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
610daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
611b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
612b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
614daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
615daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
616daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
617daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
618daf98e941e140e8739458126640183b9f296a2abChet Haase                int regionOp = getInt();
619daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
620daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, regionOp);
621daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
623b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6240fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
625daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
6267b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
6277b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
6287b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, %d", (char*) indent, OP_NAMES[op],
6297b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                    displayList, width, height, level + 1);
6307b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                needsInvalidate |= renderer.drawDisplayList(displayList, width, height,
6317b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                        dirty, level + 1);
6320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
6330fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
6346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
635daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
636daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
637daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
638daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
639daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
640daf98e941e140e8739458126640183b9f296a2abChet Haase                    layer, x, y, paint);
641daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
6426c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
6436c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
644b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
645daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
646daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
647daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
648daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
649daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
650daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, x, y, paint);
651daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
652b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
653b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
654b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
655daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
656daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
657daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
658daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
659daf98e941e140e8739458126640183b9f296a2abChet Haase                    bitmap, matrix, paint);
660daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
661b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
662b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
663b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
664daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
665daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
666daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
667daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
668daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
669daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
670daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
671daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
672daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
673daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
674daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
675daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
676daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
677b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
678b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
6795a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
6805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int verticesCount = 0;
6815a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
6825a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
6835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
6845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
6855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
6865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
6875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
6885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                int* colors = hasColors ? getInts(colorsCount) : NULL;
6895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
690daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
6915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, getPaint());
6925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
693a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
694b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
695b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
696b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
6974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
698b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
699b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
7004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
701b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
702b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
703b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
704b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
705b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
7064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
707b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
708daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
7094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
7104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                        numColors, getFloat(), getFloat(), getFloat(), getFloat(), getPaint());
711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
712b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
713b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
714daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
715daf98e941e140e8739458126640183b9f296a2abChet Haase                int xferMode = getInt();
716daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
717daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
718b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
719b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
720b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
721daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
722daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
723daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
724daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
725daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
726daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
727daf98e941e140e8739458126640183b9f296a2abChet Haase                    f1, f2, f3, f4, paint);
728daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
729b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
730b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
73101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
732daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
733daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
734daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
735daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
736daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
737daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
738daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
739daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
740daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
741daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
74201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
74301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
74401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
745daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
746daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
747daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
748daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
749daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
750daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
751daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
75201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
75301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
754c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
755daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
756daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
757daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
758daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
759daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
760daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
761daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
762daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
763c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
764c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
7658b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
766daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
767daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
768daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
769daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
770daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
771daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
772daf98e941e140e8739458126640183b9f296a2abChet Haase                int i1 = getInt();
773daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
774daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
775daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
776daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
7778b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
7788b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
779b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
780daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
781daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
782daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
783daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
784b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
785b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
786b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
787b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int count = 0;
788b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
789daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
790b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.drawLines(points, count, getPaint());
791b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
793ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
794ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                int count = 0;
795ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
796ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
797ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                renderer.drawPoints(points, count, getPaint());
798ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
799ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
800b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
801b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
802daf98e941e140e8739458126640183b9f296a2abChet Haase                int count = getInt();
803daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
804daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
805daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPaint* paint = getPaint();
806daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
807daf98e941e140e8739458126640183b9f296a2abChet Haase                    text.text(), text.length(), count, x, y, paint);
808daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawText(text.text(), text.length(), count, x, y, paint);
809b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
810b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
811b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
812daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
813b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
814b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
815b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
816b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
817daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
818daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
819daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
820b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
821b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
822b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
823daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
824b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
825b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
827b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
828daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
829daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
830daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
831b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
832b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
833b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
834daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
835b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
837b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
838b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
839daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
840daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
841daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
842daf98e941e140e8739458126640183b9f296a2abChet Haase                int color = getInt();
843daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
844daf98e941e140e8739458126640183b9f296a2abChet Haase                    radius, dx, dy, color);
845daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
846daf98e941e140e8739458126640183b9f296a2abChet Haase            }
847daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
848daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
849daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
850daf98e941e140e8739458126640183b9f296a2abChet Haase                    (char*) indent, OP_NAMES[op]);
851daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
852b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
853b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
854ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
855daf98e941e140e8739458126640183b9f296a2abChet Haase    DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate);
856daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
857b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
859b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
8604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
8614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
8624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8632fc941e4650d618ff6e122f28b616d9032ffa134Romain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE) {
8645977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mDisplayList = NULL;
8654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
8684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
8694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
8724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
8735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
8745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
8755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
8765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = mBitmapResources.itemAt(i);
8775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.decrementRefcount(resource);
8785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
8795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
880d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
88143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
88243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy       caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
88343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
88424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
88524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
88643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
88743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
88843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
8892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
8902fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
891d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
8924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
8934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
8954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
8964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
8974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8985977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList* DisplayListRenderer::getDisplayList() {
8995977baa1fa24125c148a72699b53e62abaf08960Chet Haase    if (mDisplayList == NULL) {
9005977baa1fa24125c148a72699b53e62abaf08960Chet Haase        mDisplayList = new DisplayList(*this);
9015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
902d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        mDisplayList->initFromDisplayListRenderer(*this, true);
9035977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
9045977baa1fa24125c148a72699b53e62abaf08960Chet Haase    return mDisplayList;
9055977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
9065977baa1fa24125c148a72699b53e62abaf08960Chet Haase
907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
911b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
912b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
913b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
9147d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
9157d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
916b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
917b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
92027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
92127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
92227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
92327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
92427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
92527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    OpenGLRenderer::finish();
926b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
927b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
928daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
929daf98e941e140e8739458126640183b9f296a2abChet Haase}
930daf98e941e140e8739458126640183b9f296a2abChet Haase
9312b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
9324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
934cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
935cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
936daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
937daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
938daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
939daf98e941e140e8739458126640183b9f296a2abChet Haase}
940daf98e941e140e8739458126640183b9f296a2abChet Haase
9414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
942b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
9434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
9444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
9454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
948b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Restore);
9494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
9504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
95327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
9544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
9554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
9585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
959b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
9604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
9614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
9624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
9644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
9675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
9685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
9695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
9705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
9715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
9725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
9735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
9745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
9754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Translate);
9774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
9784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
9794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
982b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
9834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
9844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
9854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
9894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
9904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
9914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
9924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
993807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
994807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
995807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
996807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
997807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
998807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
9994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
10014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
10034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1006b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
10074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
10094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
10124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1013b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
10144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
10154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
10164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
10174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10197b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
10207b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        uint32_t width, uint32_t height, Rect& dirty, uint32_t level) {
1021cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1022cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
10230fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addOp(DisplayList::DrawDisplayList);
10240fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
10257b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
1026daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
10270fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
10280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1029ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
10306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1031ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1032ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
10336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
10346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
10356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
10364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top,
10375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1038b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmap);
10394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
10414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10445c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix,
10455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapMatrix);
10474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
10494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
10534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
10545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
1055b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawBitmapRect);
10564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
10584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
10594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
10635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
10645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
10655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
10665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
10675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
10685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
10695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
10705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
10715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
10725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
10735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
10745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
10755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
10765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
10775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
10794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
10805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
1081b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPatch);
10824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
10834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
10844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
10854bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
10864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
10874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
10884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1091b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
10924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
10934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
10944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
10954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
10964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
10975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
1098b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawRect);
10994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
11004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
110301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
110401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint) {
110501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawRoundRect);
110601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
110701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
110801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
110901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
111001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
111101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
111201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
111301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
111401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
111501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
111601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
111701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1118c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1119c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1120c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1121c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1122c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1123c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1124c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
11258b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
11268b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
112782d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
11288b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
11298b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
11308b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
11318b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
11328b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
11338b2f5267f16c295f12faab810527cd6311997e34Romain Guy
11344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
1135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawPath);
11364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
11374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11405c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
11424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
11434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1144ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1145ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1146ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1147ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1148ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1149ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
11504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
11534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float x, float y, SkPaint* paint) {
1154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawText);
11554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addText(text, bytesCount);
11564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(count);
11574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(x, y);
11584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
11594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
11634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
11665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
11675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
11684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
11724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1175ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1176ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
11774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
11814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
11854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
11864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
11874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
11884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
11894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
11914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1192