DisplayListRenderer.cpp revision d5a85fb63d91a9297e8d9a11016f3b3ed60dfbab
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
19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h>
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
219c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
2413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
29b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
30b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
32ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
33ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
414cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
505a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
56c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
578b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
58ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
59ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
60ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
62325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
63eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
69daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
72daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
73ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
74ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
759c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
769c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
919c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
929c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
94b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) {
955977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
965977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase
985977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
99d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
100d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
101d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
102a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
103a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
104a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
105a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
106a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mApplicationScale = -1;
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTransformMatrix = NULL;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTransformCamera = NULL;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTransformMatrix3D = NULL;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
133bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
134bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
140d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1425977baa1fa24125c148a72699b53e62abaf08960Chet Haase
143a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mTransformMatrix) {
144a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        delete mTransformMatrix;
145a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mTransformMatrix = NULL;
146a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
147a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mTransformCamera) {
148a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        delete mTransformCamera;
149a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mTransformCamera = NULL;
150a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
151a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mTransformMatrix3D) {
152a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        delete mTransformMatrix3D;
153a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mTransformMatrix3D = NULL;
154a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
155a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1565977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase
163d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
164d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
16824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
16943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
170d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1715977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1735977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1792fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1801af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1811af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1821af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1832fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1865977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase
192d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
200d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
201d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
203d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
205d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
20665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
20765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
20965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
219d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
220d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
221d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
222d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
223d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
22724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
22824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
229d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
231d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
234d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
235d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
244d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
245d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
246d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
247d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
25165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
25204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
25365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
25465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
25565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
25665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
27213631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
28133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
28233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
28333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
28433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2955baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
2995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
37933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
400a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
408a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
423a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
450a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
451a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
452a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
453a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
456a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
472a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
484a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
493a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
503a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
541325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
545cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
547a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
550325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
551325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
552325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
553325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
561eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
562eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
563eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
564eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
567eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
568a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
569eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
5975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
598a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
611ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
613a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
615ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
617a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
618a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
619a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mAlpha < 1) {
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // have to pass it into this call. In fact, this information might be in the
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // location/size info that we store with the new native transform data.
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mClipChildren) {
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
704ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t level) {
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.translate(mLeft, mTop);
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.scale(mApplicationScale, mApplicationScale);
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mAlpha < 1 && !mCaching) {
727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // have to pass it into this call. In fact, this information might be in the
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // location/size info that we store with the new native transform data.
730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mClipChildren) {
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
735a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
737a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
738a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
739a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
740a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
741a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
742a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
743a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.translate(mTranslationX, mTranslationY);
744a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
745a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
746a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
747a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
748a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
749a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
750a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
751a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
752a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
753a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.concatMatrix(mTransformMatrix);
754a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
755a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
756a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    SkRegion::kIntersect_Op);
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::transformRect(float left, float top, float right, float bottom, Rect& result) {
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.left = left + mLeft;
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.top = top + mTop;
768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.right = right + mLeft;
769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.bottom = bottom + mTop;
770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixFlags != 0) {
771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == TRANSLATION) {
772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.left += mTranslationX;
773a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.top += mTranslationY;
774a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.right += mTranslationX;
775a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.bottom += mTranslationY;
776a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
777a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            updateMatrix();
778a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            SkRect r;
779a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fLeft = result.left;
780a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fTop = result.top;
781a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fRight = result.right;
782a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fBottom = result.bottom;
783a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->mapRect(&r);
784a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.left = r.fLeft;
785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.top = r.fTop;
786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.right = r.fRight;
787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.bottom = r.fBottom;
788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
790ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
791ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
792a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
793ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
794ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
795ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
796ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
797ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
798a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasebool DisplayList::replay(OpenGLRenderer& renderer, uint32_t width,
799a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
800daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
801b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
802b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
803b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
804ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
805ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
806ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
807ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
808ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
809ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
810ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
81113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
812ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
813b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
81413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
815a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int restoreTo = 0;
816a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
817a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", indent, "Save",
818a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
819a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
820a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
821a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    setViewProperties(renderer, width, height, level);
82213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
824ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
825b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
82733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
82833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int32_t skip = mReader.readInt() * 4;
82933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
83033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
83133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
83233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
83333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
83433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
83533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
83633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
83733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8389c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
839ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
841daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
842daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
843daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
84413631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
845cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
84613631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
847daf98e941e140e8739458126640183b9f296a2abChet Haase            }
848daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
849b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
85033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
851daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
852daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
853b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
854b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
855b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
856daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
857b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
859b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
860b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
86133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
862daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
863daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
864b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
867daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
868daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
869daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
870daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
87233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
873daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
874a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
875daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
879daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
880daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
881daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
882daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
88333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
885daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
886a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
887daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
8885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
8895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
891daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
892daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
893daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
894daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
897b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
898daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
899daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
900daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
903b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
904daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
905daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
906daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
907daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
910807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
911daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
913daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
914daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
915807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
916807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
917b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
918daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
919daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
920daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
921b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
922b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
923b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
924daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
925a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
926a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
927a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
928a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
929a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
930a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
931daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
935daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
936daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
937daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
938daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
93933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
940daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
941a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
942daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9450fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
946daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
9477b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
9487b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
94933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
95033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
951a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
952a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                needsInvalidate |= renderer.drawDisplayList(displayList, width,
953a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        height, dirty, flags, level + 1);
9540fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
957daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
958daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
959daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
961a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
962a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
963a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
964daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
965a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
966daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
969b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
970daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
971daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
972daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
974daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
975a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
976daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
977b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
978b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
979b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
980daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
981daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
9825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
983daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
984a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
985daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
987b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
989daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
990daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
991daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
992daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
993daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
994daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
995daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
996daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
997daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
9985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
999daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1000a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1001a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1002daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1003b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1004b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
100633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
101433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10189ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1020a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1021b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1022b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1023b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1025b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1026b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1028b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1031b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1032b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1034b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10359ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1041daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10439ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1044b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1045b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
104733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
104833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1049daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1051b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1053b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1054daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1055daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1056daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1057daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1059daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1060a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1061daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1062b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1063b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
106401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1065daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1066daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1067daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1068daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1069daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1070daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1072daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1073a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1074daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
107501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
107601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
107701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1078daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
10815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1082daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1083a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1084daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
108501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
108601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1087c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1089daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1090daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1091daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1093daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1094a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1095daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1096c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1097c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
10988b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1099daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1101daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1103daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1104daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
110533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1107daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1109daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11108b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11118b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1113daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1115daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1116daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
112033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11249ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1127ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
112833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1129ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1131ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11329ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1133ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1134ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
113733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1138daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1139daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1141cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1142cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1143cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1144cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1147325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1148325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1149325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1150325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1151325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1152325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1153325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1154325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1155325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1156325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1157325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1158325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1159325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1160eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1161eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
116233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
116333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1164eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1166eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1167eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1168eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1169eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1170eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1172daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1177daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1178daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1183daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1188daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1189daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1194daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1199daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1200daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
120233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1203daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1205daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1206daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1207daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
121433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
121533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1221daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1222daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1224daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1227ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
1230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        renderer.restoreToCount(restoreTo);
1231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
123213631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
123313631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
1235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            needsInvalidate);
1236daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
1237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
124433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1256d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1259d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1260d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1261d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1262d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1263d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1264d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
126543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1266d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
126743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
126824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
126924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
127043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
127143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
127243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1273d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12742fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1276d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1277d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
127804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
127904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
12804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
12844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1286162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1287162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1288162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
12895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1290162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
12915977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
129204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1293162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
12945977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
12955977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13037d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
130927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
131027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
131127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
131227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
131327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
131433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1317daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1318daf98e941e140e8739458126640183b9f296a2abChet Haase}
1319daf98e941e140e8739458126640183b9f296a2abChet Haase
13202b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1323cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1324cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1325daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1326daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
1327daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
1328daf98e941e140e8739458126640183b9f296a2abChet Haase}
1329daf98e941e140e8739458126640183b9f296a2abChet Haase
13304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
133704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
133833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
133933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
134004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
134133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
134233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
134333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
134827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
134933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1355b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
137233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
137333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
137433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
137533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
13814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
13834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
13874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
13884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1391807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1392807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1393807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1394807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1395807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1396807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
13994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14177b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
141833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
1419cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1420cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1421a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float top = 0;
1422a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float left = 0;
1423a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float right = width;
1424a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float bottom = height;
1425a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1426a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        Rect transformedRect;
1427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        displayList->transformRect(left, top, right, bottom, transformedRect);
1428a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        left = transformedRect.left;
1429a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        top = transformedRect.top;
1430a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        right = transformedRect.right;
1431a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        bottom = transformedRect.bottom;
1432a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
1433a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    const bool reject = quickReject(left, top, right, bottom);
143433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawDisplayList, reject);
14350fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
14367b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
143733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
143833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1439daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
14400fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1442ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14436c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1444ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1445ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
144933f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
145033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
145133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
145533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
145833f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
145933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
146033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
146133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
146233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
146333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
146433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
146833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
147433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
148033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
14915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
14925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
14935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
14945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
14955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
14965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
14975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
14985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
15004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
15015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
150233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
150333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1514b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
152133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
152633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
152901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1530a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
153133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
153333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
153401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
153501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
153601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
153801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
153901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
154001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
154101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
154201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
154301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
154401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
154501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
154601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1547c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1548c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1549c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1550c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1551c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1552c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1553c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15548b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15558b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
155682d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15578b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15588b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15608b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15618b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15628b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
156433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
156533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
156633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
156733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
156833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
156933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
157233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15755c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1576b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1579ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1580ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1581ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1582ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1583ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1584ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1588cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
15918f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
15928f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
15938f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
15948f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
15958f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
15968f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1597c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
15988f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
159933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
160033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
160133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
160333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
160733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
160933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
161333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
16154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1617325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1618325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1619325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1620325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1621325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1622325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1623325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1624325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1625325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1626325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1627325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1628325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1629325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1630eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1631eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
163233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1633eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1634eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1635eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1636eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1637eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1638eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1639eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1640eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1642b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1651b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1655ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1656ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1660b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1664b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1682