DisplayListRenderer.cpp revision a23eed808a1ae4ec0d818c0a9238385e797fd056
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
216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
525a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
58c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
62ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
71daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
74daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
75ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
96491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mStaticMatrix(NULL), mAnimationMatrix(NULL) {
99491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1035977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
104d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
110b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mRight = 0;
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
115db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    mHasOverlappingRendering = true;
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
125b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mCameraDistance = 0;
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
142bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
143d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase
146866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mTransformMatrix;
1489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mTransformCamera;
1499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mTransformMatrix3D;
1509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mStaticMatrix;
1519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mAnimationMatrix;
1529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mTransformMatrix = NULL;
1539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mTransformCamera = NULL;
1549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mTransformMatrix3D = NULL;
1559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mStaticMatrix = NULL;
1569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mAnimationMatrix = NULL;
157a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
158a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
169d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
170d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
173d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1815977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1822fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1831af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1841af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1851af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1945977baa1fa24125c148a72699b53e62abaf08960Chet Haase
195d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
203d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
204d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
205d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
208d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
20965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
222d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
223d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
228d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
229d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
23024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
23124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
232d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
233d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
234d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
240d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
241d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
247d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
250d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
25465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
25504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
25665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
25765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
25865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
25965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
27513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
28433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
28533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
28633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
28733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3355baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
38233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
38333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
384a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
394a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
403a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
411a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
426a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
453a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
454a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
455a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
456a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
459a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
475a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
487a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4955baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
496a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
506a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
519a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
544325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
548cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
550a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
553325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
561325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
562325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
563325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
564eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
566eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
567eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
568eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
570eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
571a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
572eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5795baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
598ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
601a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
602ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
603ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
616a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
619ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
6709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
6719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
6729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        if (mStaticMatrix) {
6739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    indent, "ConcatMatrix (static)", mStaticMatrix,
6759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(0), mStaticMatrix->get(1),
6769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(2), mStaticMatrix->get(3),
6779420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(4), mStaticMatrix->get(5),
6789420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(6), mStaticMatrix->get(7),
6799420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(8));
6809420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
6819420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        if (mAnimationMatrix) {
6829420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6839420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    indent, "ConcatMatrix (animation)", mAnimationMatrix,
6849420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(0), mAnimationMatrix->get(1),
6859420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(2), mAnimationMatrix->get(3),
6869420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(4), mAnimationMatrix->get(5),
6879420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(6), mAnimationMatrix->get(7),
6889420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(8));
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
703b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        if (mAlpha < 1 && !mCaching) {
7049d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
7059d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // have to pass it into this call. In fact, this information might be in the
7069d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // location/size info that we store with the new native transform data.
7079d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
7089d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            if (mClipChildren) {
7099d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
7109d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
7119d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7129d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7139d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    mMultipliedAlpha, flags);
7149d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
721ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t level) {
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
7359420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.translate(mLeft, mTop);
737a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7389420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        if (mStaticMatrix) {
7399420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7409420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7419420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    indent, "ConcatMatrix (static)", mStaticMatrix,
7429420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(0), mStaticMatrix->get(1),
7439420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(2), mStaticMatrix->get(3),
7449420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(4), mStaticMatrix->get(5),
7459420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(6), mStaticMatrix->get(7),
7469420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mStaticMatrix->get(8));
7479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            renderer.concatMatrix(mStaticMatrix);
7489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        } else if (mAnimationMatrix) {
7499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    indent, "ConcatMatrix (animation)", mAnimationMatrix,
7529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    mAnimationMatrix->get(8));
7579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            renderer.concatMatrix(mAnimationMatrix);
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.translate(mTranslationX, mTranslationY);
763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.concatMatrix(mTransformMatrix);
773a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
774a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7759d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        if (mAlpha < 1 && !mCaching) {
776db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            if (!mHasOverlappingRendering) {
777db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
778db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                renderer.setAlpha(mAlpha);
779db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase            } else {
780db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                // TODO: should be able to store the size of a DL at record time and not
781db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                // have to pass it into this call. In fact, this information might be in the
782db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                // location/size info that we store with the new native transform data.
783db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
784db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                if (mClipChildren) {
785db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                    flags |= SkCanvas::kClipToLayer_SaveFlag;
786db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                }
787db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
788db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                        (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
789db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                        mMultipliedAlpha, flags);
790db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
791db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase                        mMultipliedAlpha, flags);
7929d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
7939d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
794a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
795a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
796a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
797a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
798a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    SkRegion::kIntersect_Op);
799a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
800a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
801a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
802a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
803ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
804ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
805ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
806ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
807ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8086554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayList::replay(OpenGLRenderer& renderer, uint32_t width,
809a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
8106554943a1dd6854c0f4976900956e556767b49e1Romain Guy    status_t drawGlStatus = 0;
811b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
812b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
813b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
814ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
815ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
816ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
817ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
818ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
819ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
820ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
821a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
822a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
823a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
824a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
825ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
82713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
828a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int restoreTo = 0;
829a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
830a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", indent, "Save",
831a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
832a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
833a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
834a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    setViewProperties(renderer, width, height, level);
835b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES && renderer.quickReject(0, 0, width, height)) {
836b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
837b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
838b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
839b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        return false;
840b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
84113631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8429c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
843ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
844b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8455b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
84633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
847390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
84833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
84933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
85033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
85133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
85233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
85333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
85433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
85533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
85633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8579c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
858ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
860daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
861daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
862daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
86313631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8646554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
86513631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
866daf98e941e140e8739458126640183b9f296a2abChet Haase            }
867daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
86933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
870daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
871daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
872b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
873b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
874b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
875daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
878b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
879b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
88033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
881daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
882daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
885b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
886daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
887daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
888daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
889daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
89133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
892daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
893a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
894daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8975b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
898daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
899daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
900daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
901daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
90233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
90333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
904daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
905a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
906daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
910daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
911daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
913daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
914b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
915b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
916b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
917daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
918daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
919daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
920b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
921b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
922b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
923daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
924daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
925daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
926daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
927b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
928b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
929807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
930daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
931daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
932daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
933daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
934807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
935807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
936b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
937daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
938daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
939daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
942b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
943daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
944a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
945a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
946a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
947a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
948a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
949a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
950daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
952b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
953b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
954daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
955daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
956daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
957daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
95833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
959daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
960a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
961daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
965daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
9667b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
9677b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
96833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
96933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
970a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
9716554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.drawDisplayList(displayList, width,
972a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        height, dirty, flags, level + 1);
9730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
976daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
977daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
978daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
980a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
981a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
982a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
983daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
984a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
985daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9876c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
989daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
990daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
991daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
993b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
994b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
995b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
996daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
997a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
998daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
999b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1001b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1002daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1005daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1006a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1007daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
1008b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1009b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1010b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1011daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1012daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1013daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1014daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1015daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1016daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1018daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1019daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1021daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1022a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1023a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1024daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1025b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1026b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
102833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
103633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1039daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10415a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1042a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1043b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1044b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1045b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10464bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1050b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1051b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1053b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1054b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1056b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10579ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10589ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10599ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10609ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10629ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1063daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10644bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10659ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1067b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1068b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
106933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
107033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1071daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1072daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1073b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1074b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1076daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1077daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1078daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1081daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1082a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1083daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1084b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1085b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
108601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1087daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1089daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1090daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1091daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1092daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1094daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1095a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1096daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
109701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
109801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
109901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1101daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1104daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1105a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1106daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
110701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
110801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1109c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1110daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1111daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1112daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1113daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1115daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1117daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1118c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1119c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11208b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1121daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1125daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1126daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
112733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1129daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1131daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11328b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11338b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1135daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1137daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1138daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
114233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11469ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1149ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
115033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1151ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1153ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11549ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1155ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1156ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
115933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1161daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1163cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1164cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1165cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1166cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1169325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1170325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1171325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1172325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1173325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1174325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1175325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1176325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1177325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1178325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1179325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1180325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1181325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1182eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1183eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
118433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
118533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1186eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1188eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1189eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1190eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1191eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1192eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1194daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1199daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1200daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1205daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1210daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1211daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1212daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1216daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1221daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1222daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1223daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
122433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1225daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1227daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1228daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1229daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12345ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
123633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
123733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1243daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1244daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1246daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1249ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
1252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        renderer.restoreToCount(restoreTo);
1253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
125413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
125513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12576554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12586554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
126633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1278d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1281d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1282d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1283d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1284d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1285d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1286d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
128743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1288d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
128943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
129024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
129124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
129243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
129343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
129443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1295d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1298d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1299d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
130004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
130104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1308162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1309162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1310162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13115977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1312162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13135977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
131404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1315162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13165977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13175977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1323b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13267d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
133127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
133227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
133327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
133427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
133527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
133633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1339daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1340daf98e941e140e8739458126640183b9f296a2abChet Haase}
1341daf98e941e140e8739458126640183b9f296a2abChet Haase
13422b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13456554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1346cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1347daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1348daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
13496554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1350daf98e941e140e8739458126640183b9f296a2abChet Haase}
1351daf98e941e140e8739458126640183b9f296a2abChet Haase
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
135904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
136033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
136133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
136204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
136333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
136433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
136533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
137027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
137133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13915b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13925b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
139433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
139533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
139633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
139733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1413807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1414807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1415807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1416807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1417807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1418807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1426b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14396554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
144033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
1441cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1442cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1443b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1444b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14450fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
14467b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
144733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14486554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14490fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1451ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14526c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1453ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1454ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14556c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14576c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
145833f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
145933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
146033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
146433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
146733f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
146833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
146933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
147033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
147133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
147233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
147333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
147733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
148333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
148433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
148933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14995a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
15005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
15015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
15065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
15094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
15105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
151133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
151233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15164bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
153033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
153133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
153533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
153801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1539a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
154033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
154133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
154233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
154301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
154401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
154501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
154633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
154701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
154801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
154901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
155001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
155101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
155201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
155301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
155401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
155501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1556c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1557c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1558c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1559c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1560c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1561c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1562c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15638b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15648b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
156582d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15668b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15678b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15688b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15698b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15708b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15718b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
157333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
157433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
157533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
157633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
157733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
157833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
158133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15845c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1585b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1588ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1589ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1590ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1591ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1592ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1593ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1597cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
159833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
159933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
16008f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
16018f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
16028f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
16038f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
16048f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
16058f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1606c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
16078f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
160933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
161233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
161333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
161633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
161733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
161833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
161933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
162033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
162233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
162333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
16244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1626325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1627325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1628325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1629325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1630325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1631325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1632325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1633325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1634325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1635325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1636325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1637325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1638325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1639eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1640eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
164133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1642eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1643eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1644eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1645eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1646eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1647eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1648eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1649eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1651b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1660b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1664ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1665ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1669b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1673b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1691