DisplayListRenderer.cpp revision 491189f6bb81827a0c8e343f89420a9bcd2e62ae
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
94491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
95491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL) {
96491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
975977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
985977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1005977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
101d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
102d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
103d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
104a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
105a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
106a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mApplicationScale = -1;
110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
132bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
133bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
134bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
139d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1405977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1415977baa1fa24125c148a72699b53e62abaf08960Chet Haase
142866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
143866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformMatrix) {
144866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformMatrix;
145866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformMatrix = NULL;
146866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
147866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformCamera) {
148866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformCamera;
149866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformCamera = NULL;
150866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
151866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformMatrix3D) {
152866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformMatrix3D;
153866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformMatrix3D = NULL;
154866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
155a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
164d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
16924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1725977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1802fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1811af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1821af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1831af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase
193d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
201d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
203d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
204d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
20765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
220d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
221d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
222d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
223d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
22824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
22924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
231d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
232d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
235d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
245d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
246d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
247d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
25265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
25304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
25465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
25565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
25665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
25765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
27313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
28233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
28333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
28433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
28533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
38133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
392a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
401a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
409a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4235baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
424a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
451a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
452a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
453a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
454a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
457a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4635baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
473a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
485a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
494a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
517a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5235baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5305baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
542325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
546cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
548a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
551325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
552325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
553325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
561325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
562eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
563eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
564eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
566eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
568eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
569a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
570eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
5985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
599a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
601ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
612ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6135baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
614a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
615ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
618a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
619a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mAlpha < 1) {
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // have to pass it into this call. In fact, this information might be in the
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // location/size info that we store with the new native transform data.
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mClipChildren) {
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
705ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t level) {
708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.translate(mLeft, mTop);
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.scale(mApplicationScale, mApplicationScale);
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mAlpha < 1 && !mCaching) {
728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // have to pass it into this call. In fact, this information might be in the
730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            // location/size info that we store with the new native transform data.
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mClipChildren) {
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
735a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
737a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
738a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
739a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mMultipliedAlpha, flags);
740a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
741a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
742a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
743a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
744a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.translate(mTranslationX, mTranslationY);
745a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
746a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
747a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
748a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
749a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
750a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
751a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
752a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
753a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
754a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.concatMatrix(mTransformMatrix);
755a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
756a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    SkRegion::kIntersect_Op);
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::transformRect(float left, float top, float right, float bottom, Rect& result) {
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.left = left + mLeft;
768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.top = top + mTop;
769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.right = right + mLeft;
770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    result.bottom = bottom + mTop;
771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixFlags != 0) {
772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == TRANSLATION) {
773a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.left += mTranslationX;
774a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.top += mTranslationY;
775a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.right += mTranslationX;
776a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.bottom += mTranslationY;
777a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
778a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            updateMatrix();
779a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            SkRect r;
780a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fLeft = result.left;
781a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fTop = result.top;
782a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fRight = result.right;
783a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            r.fBottom = result.bottom;
784a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->mapRect(&r);
785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.left = r.fLeft;
786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.top = r.fTop;
787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.right = r.fRight;
788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            result.bottom = r.fBottom;
789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
790a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
791ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase}
792ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
793a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
794ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
795ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
796ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
797ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
798ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
799a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasebool DisplayList::replay(OpenGLRenderer& renderer, uint32_t width,
800a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
801daf98e941e140e8739458126640183b9f296a2abChet Haase    bool needsInvalidate = false;
802b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
803b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
804b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
805ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
806ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
807ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
808ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
809ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
810ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
811ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
81213631f3da855f200a151e7837ed9f6b079622b58Romain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
813ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
814b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
81513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
816a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int restoreTo = 0;
817a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
818a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", indent, "Save",
819a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
820a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
821a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
822a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    setViewProperties(renderer, width, height, level);
82313631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
825ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
82833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
82933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int32_t skip = mReader.readInt() * 4;
83033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
83133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
83233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
83333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
83433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
83533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
83633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
83733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
83833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8399c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
840ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
842daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
843daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
844daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
84513631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
846cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy                needsInvalidate |= renderer.callDrawGLFunction(functor, dirty);
84713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
848daf98e941e140e8739458126640183b9f296a2abChet Haase            }
849daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
850b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
85133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
852daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
853daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
854b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
855b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
856b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
857daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
859b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
860b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
861b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
86233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
863daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
864daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
868daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
869daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
870daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
871daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
87333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
874daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
875a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
876daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
878b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
880daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
881daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
882daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
883daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
88533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
886daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
887a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
888daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
8895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
8905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
891b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
892daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
893daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
894daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
895daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
897b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
898b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
899daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
900daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
901daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
903b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
904b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
905daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
906daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
907daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
908daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
911807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
912daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
913daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
914daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
915daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
916807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
917807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
919daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
920daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
921daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
922b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
923b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
924b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
925daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
926a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
927a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
928a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
929a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
930a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
931a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
932daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
936daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
937daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
938daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
939daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
94033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
941daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
942a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
943daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
947daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
9487b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
9497b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
95033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
95133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
952a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
953a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                needsInvalidate |= renderer.drawDisplayList(displayList, width,
954a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        height, dirty, flags, level + 1);
9550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9560fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9576c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
958daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
959daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
960daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
962a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
963a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
964a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
965daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
966a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
967daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
970b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
971daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
972daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
973daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
975daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
976a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
977daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
978b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
979b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
980b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
981daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
982daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
9835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
984daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
985a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
986daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
987b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
990daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
991daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
992daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
993daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
994daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
995daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
996daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
997daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
998daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
9995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1000daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1001a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1004b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1005b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
100733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
101533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1018daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10199ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1021a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1022b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1023b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1024b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1026b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1027b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1031b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1032b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1033b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1035b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10399ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10419ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1042daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10434bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10449ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1045b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
104833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
104933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1051daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1053b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1054b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1055daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1056daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1057daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1058daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1060daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1061a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1062daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1063b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
106501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1066daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1067daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1068daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1069daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1070daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1071daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1073daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1074a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1075daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
107601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
107701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
107801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1081daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
10825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1083daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1084a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1085daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
108601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
108701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1088c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1089daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1090daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1091daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1092daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1094daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1095a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1096daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1097c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1098c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
10998b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1101daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1103daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1104daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1105daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
110633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1108daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1110daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11118b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11128b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1114daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1116daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1117daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
112133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11259ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1128ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
112933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1130ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1132ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11339ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1134ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1135ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
113833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1139daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1140daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1142cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1143cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1144cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1145cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1148325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1149325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1150325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1151325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1152325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1153325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1154325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1155325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1156325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1157325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1158325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1159325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1160325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1161eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1162eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
116333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
116433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1165eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1167eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1168eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1169eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1170eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1171eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1173daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1178daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1180daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1184daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1189daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1191daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1195daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1200daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1202daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
120333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1204daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1206daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1207daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1208daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
121533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
121633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1222daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1223daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1225daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1228ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
1231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        renderer.restoreToCount(restoreTo);
1232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
123313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
123413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
1236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            needsInvalidate);
1237daf98e941e140e8739458126640183b9f296a2abChet Haase    return needsInvalidate;
1238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
124533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1257d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1260d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1261d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1262d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1263d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1264d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1265d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
126643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1267d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
126843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
126924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
127024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
127143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
127243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
127343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1274d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1277d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1278d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
127904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
128004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
12814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
12854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1287162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1288162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1289162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
12905977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1291162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
12925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
129304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1294162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
12955977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
12965977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13047d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13057d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
131027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
131127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
131227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
131327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
131427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
131533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1317b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1318daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1319daf98e941e140e8739458126640183b9f296a2abChet Haase}
1320daf98e941e140e8739458126640183b9f296a2abChet Haase
13212b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1324cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1325cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1326daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1327daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
1328daf98e941e140e8739458126640183b9f296a2abChet Haase    return false; // No invalidate needed at record-time
1329daf98e941e140e8739458126640183b9f296a2abChet Haase}
1330daf98e941e140e8739458126640183b9f296a2abChet Haase
13314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
133804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
133933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
134033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
134104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
134233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
134333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
134433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
134927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
135033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1356b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
137333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
137433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
137533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
137633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
13834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
13844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1387b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
13884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1392807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1393807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1394807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1395807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1396807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1397807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14187b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList,
141933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
1420cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1421cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1422a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float top = 0;
1423a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float left = 0;
1424a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float right = width;
1425a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float bottom = height;
1426a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        Rect transformedRect;
1428a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        displayList->transformRect(left, top, right, bottom, transformedRect);
1429a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        left = transformedRect.left;
1430a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        top = transformedRect.top;
1431a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        right = transformedRect.right;
1432a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        bottom = transformedRect.bottom;
1433a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
1434a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    const bool reject = quickReject(left, top, right, bottom);
143533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawDisplayList, reject);
14360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
14377b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
143833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
143933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1440daf98e941e140e8739458126640183b9f296a2abChet Haase    return false;
14410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14420fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1443ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1445ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1446ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
145033f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
145133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
145233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
145633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
145933f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
146033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
146133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
146233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
146333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
146433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
146533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
146933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
147633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
148133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
14925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
14935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
14945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
14955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
14965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
14975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
14985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
14995a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
15014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
15025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
150333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
150433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15084bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1515b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
152433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
152733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
153001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1531a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
153333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
153433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
153501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
153601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
153701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
153833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
153901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
154001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
154101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
154201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
154301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
154401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
154501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
154601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
154701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1548c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1549c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1550c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1551c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1552c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1553c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1554c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15558b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15568b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
155782d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15588b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15608b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15618b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15628b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15638b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
156533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
156633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
156733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
156833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
156933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
157033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
157333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15765c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1577b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1580ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1581ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1582ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1583ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1584ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1585ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1589cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
159133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
15928f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
15938f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
15948f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
15958f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
15968f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
15978f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1598c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
15998f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
160033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
160133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
160333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
160733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
160933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
161233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
16164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1618325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1619325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1620325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1621325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1622325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1623325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1624325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1625325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1626325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1627325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1628325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1629325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1630325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1631eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1632eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
163333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1634eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1635eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1636eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1637eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1638eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1639eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1640eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1641eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1643b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1652b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1656ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1657ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1661b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1665b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1683