DisplayListRenderer.cpp revision d34dd71800d9a1077e58c3b7f2511c46848da417
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
1461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix;
1471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformCamera;
1481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix3D;
1491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mStaticMatrix;
1501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mAnimationMatrix;
1511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
164d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
16924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1725977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1802fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1811af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1821af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1831af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
187d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
188d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
189d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
190d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
191d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1945977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1955977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1965977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1975977baa1fa24125c148a72699b53e62abaf08960Chet Haase
198d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
207d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
208d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
209d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
211d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
21265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
21365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
225d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
228d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
229d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
231d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
232d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
23324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
23424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
235d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
236d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
237d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
240d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
241d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
242d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
243d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
244d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2482fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2492fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
250d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    const SortedVector<SkPath*> &sourcePaths = recorder.getSourcePaths();
251d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < sourcePaths.size(); i++) {
252d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        mSourcePaths.add(sourcePaths.itemAt(i));
253d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.incrementRefcount(sourcePaths.itemAt(i));
254d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
255d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
256d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
257d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
258d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
259d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
26365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
26404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
26565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
26665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
26765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
26865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
28413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
285ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
2861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
29433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
29533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
29633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
29733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
39033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
39133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
3921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
402a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
411a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
419a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
434a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
461a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
462a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
463a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
464a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
467a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
483a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
495a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5135baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
514a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
527a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
552325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
556cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
558a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
561325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
562325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
563325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
564325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
565325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
566325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
567325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
568325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
569325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
570325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
571325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
572eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
573eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
574eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
575eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
576eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
578eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
579a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
580eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
598ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
601ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
602ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
603ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
604ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
605ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
606ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
607ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
609a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
610ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
611ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
622ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6235baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
625ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
626ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
627ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
6751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
6761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
6771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
6781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
6801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
6821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
6831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
6841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
6851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
6861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
6871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
6891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
6911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
6921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
6931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
6941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
6951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
6961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
6981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
6991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7019420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7089d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
727ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
735a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
777a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
7851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
7909d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
7969d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
803a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
804a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
805a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
806ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
807ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
808ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
809ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
810ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
8126554943a1dd6854c0f4976900956e556767b49e1Romain Guy    status_t drawGlStatus = 0;
813b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
814b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
815b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
816ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
817ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
818ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
819ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
820ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
821ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
822ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
823a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
824a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
825a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
826a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
827ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
828b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
82913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (renderer.quickReject(0, 0, mWidth, mHeight)) {
835b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
836b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
837b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
838b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        return false;
839b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
84013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8419c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
842ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
843b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8445b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
84533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
846390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
84733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
84833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
84933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
85033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
85133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
85233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
85333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
85433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
85533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8569c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
857ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
859daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
860daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
861daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
86213631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8636554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
86413631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
865daf98e941e140e8739458126640183b9f296a2abChet Haase            }
866daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
86833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
869daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
870daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
871b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
872b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
873b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
874daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
875b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
878b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
87933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
880daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
881daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
885daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
886daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
887daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
888daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
89033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
891daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
892a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
893daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
894b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8965b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
897daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
898daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
899daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
900daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
90133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
90233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
903daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
904a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
905daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
909daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
910daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
911daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
912daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
913b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
914b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
915b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
916daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
917daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
918daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
920b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
921b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
922daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
923daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
924daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
925daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
926b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
927b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
928807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
929daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
930daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
931daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
932daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
933807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
934807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
936daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
937daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
938daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
942daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
943a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
944a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
945a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
946a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
947a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
948a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
949daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
952b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
953daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
954daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
955daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
956daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
95733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
958daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
959a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
960daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
961b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
964daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
96533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
96633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
9671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
9681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
9690fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
972daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
973daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
974daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
9766f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
977a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
978a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
979daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
980a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
981daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
984b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
985daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
986daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
987daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
9896f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
990b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
991b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
992daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
993a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
994daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
995b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
996b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
998daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
999daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1001daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
1004b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1005b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1006b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1007daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1008daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1009daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1010daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1011daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1012daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1013daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1014daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1015daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1018a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1019a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1020daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1021b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1022b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
102433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
103233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1035daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1038a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1039b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1040b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1041b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1043b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1044b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10454bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1049b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1050b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10539ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10549ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10559ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10569ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10589ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1059daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10604bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10619ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1062b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1063b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
106533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
106633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1067daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1068daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1069b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1070b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1071b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1072daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1073daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1074daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1075daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1077daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1078a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1080b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1081b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
108201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1083daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1084daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1085daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1086daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1087daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1090daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1091a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1092daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
109301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
109401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
109501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1096daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1097daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1098daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
10995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1101a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
110301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
110401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1105c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1106daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1107daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1108daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1109daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1111daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1113daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1114c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1115c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11168b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1117daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1118daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1119daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1120daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1121daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
112333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1125daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1127daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11288b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11298b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1131daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1133daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1134daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
113833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1141daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11429ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1145ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
114633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1147ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1149ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11509ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1151ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1152ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
115533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1156daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1159cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1160cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1161cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1162cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1165325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1166325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1167325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1168325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1169325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1170325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1171325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1172325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1173325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1174325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1175325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1176325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1177325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1178eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1179eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
118033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
118133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1182eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1184eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1185eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1186eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1187eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1188eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1195daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1196daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1197daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1206daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1207daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1208daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1212daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1217daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1218daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1219daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
122033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1221daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1223daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1224daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1225daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
123233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
123333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12345ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1239daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1240daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1242daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1245ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
12461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
12471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
124813631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
124913631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12516554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12526554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
126033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1272d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1275d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1276d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1277d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1278d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1279d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1280d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
128143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1282d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
128343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
128424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
128524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
128643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1287d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
1288d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
1289d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
1290d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1291d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
129243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
129343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1294d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1297d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1298d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
129904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
130004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1307162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1308162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1309162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13105977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1311162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13125977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
131304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1314162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13155977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13165977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1317b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1323b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13247d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13257d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
133027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
133127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
133227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
133327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
133427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
133533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1338daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1339daf98e941e140e8739458126640183b9f296a2abChet Haase}
1340daf98e941e140e8739458126640183b9f296a2abChet Haase
13412b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13446554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1345cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1346daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1347daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
13486554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1349daf98e941e140e8739458126640183b9f296a2abChet Haase}
1350daf98e941e140e8739458126640183b9f296a2abChet Haase
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
135804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
135933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
136033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
136104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
136233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
136333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
136433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
136927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
137033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1376b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13915b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
139333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
139433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
139533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
139633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1401b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1412807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1413807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1414807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1415807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1416807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1417807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1419b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14386554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
14391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1440cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1441cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1442b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1443b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14440fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
144533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14466554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14470fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14480fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1449ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1451ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1452ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14536c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14546c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14556c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
145633f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
145733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
145833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
146233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
146533f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
146633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
146733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
146833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
146933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
147033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
147133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
148133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
148233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
148733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
14985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
14995a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15005a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15035a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
15045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
15074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
15085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
150933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1521b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
152833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
152933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
153033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
153333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
153601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1537a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
153833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
153933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
154033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
154101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
154201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
154301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
154433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
154501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
154601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
154701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
154801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
154901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
155001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
155101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
155201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
155301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1554c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1555c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1556c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1557c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1558c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1559c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1560c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15618b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15628b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
156382d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15648b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15658b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15668b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15678b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15688b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15698b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
157133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
157233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
157333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
157433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
157533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
157633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
157933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15825c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1583b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1586ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1587ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1588ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1589ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1590ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1591ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1595cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
159633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
159733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
15988f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
15998f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
16008f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
16018f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
16028f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
16038f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1604c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
16058f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
160733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
160933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
161233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
161333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
161633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
161733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
161833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
162033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
162133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
16224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1624325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1625325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1626325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1627325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1628325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1629325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1630325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1631325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1632325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1633325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1634325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1635325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1636325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1637eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1638eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
163933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1640eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1641eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1642eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1643eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1644eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1645eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1646eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1647eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1649b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1658b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1662ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1663ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1667b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1671b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1689