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",
52e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    "DrawBitmapData",
535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
56ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
59c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
608b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
63ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
66c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    "DrawText",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
72daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
75daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
879c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
97491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mStaticMatrix(NULL), mAnimationMatrix(NULL) {
100491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1045977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
107d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
108bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
109bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
110bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
111bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
112bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
113bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
114bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
115d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
117034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy    mReader.setMemory(NULL, 0);
1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix;
1201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformCamera;
1211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix3D;
1221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mStaticMatrix;
1231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mAnimationMatrix;
12458ecc204fbcacef34806290492384677a330d4d4Romain Guy
1251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
13254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    caches.unregisterFunctors(mFunctorCount);
13358ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
13658ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1385977baa1fa24125c148a72699b53e62abaf08960Chet Haase
13949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
14049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
14158ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(bitmap);
14258ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(bitmap);
14349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
14449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
145d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
14658ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
147d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
148d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
14924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
15058ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
15158ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(mShaders.itemAt(i));
1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
15358ecc204fbcacef34806290492384677a330d4d4Romain Guy
15458ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < mSourcePaths.size(); i++) {
15558ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
15658ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
15758ecc204fbcacef34806290492384677a330d4d4Romain Guy
158603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < mLayers.size(); i++) {
159603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
160603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
161603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
16258ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1665977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1675977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1691af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1701af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1711af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1722fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
173d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17758ecc204fbcacef34806290492384677a330d4d4Romain Guy
17858ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
17958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
18058ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
18158ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
18258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mSourcePaths.clear();
18358ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaints.clear();
18458ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaths.clear();
1855977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
186603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    mLayers.clear();
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1896a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haasevoid DisplayList::reset() {
1906a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    clearResources();
1916a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    init();
1926a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase}
1936a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase
194d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
196d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
197d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
198d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
199d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
200034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy
201034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy    init();
202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
2036a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    const SkWriter32& writer = recorder.writeStream();
204034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy    if (writer.size() == 0) {
205034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy        return;
206034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy    }
207034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy
20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
20965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
21354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount = recorder.getFunctorCount();
21454c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
21654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    caches.registerFunctors(mFunctorCount);
21758ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
21949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    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);
22358ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
225d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
22649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
22749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
22849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* resource = ownedBitmapResources.itemAt(i);
22949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        mOwnedBitmapResources.add(resource);
23058ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
23149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
23249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
23349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
234d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
235d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
236d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
23758ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
238d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
239d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
24049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaShader*>& shaders = recorder.getShaders();
24124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
242d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
243d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
24458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
24558ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
24658ecc204fbcacef34806290492384677a330d4d4Romain Guy
24758ecc204fbcacef34806290492384677a330d4d4Romain Guy    const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
24858ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < sourcePaths.size(); i++) {
24958ecc204fbcacef34806290492384677a330d4d4Romain Guy        mSourcePaths.add(sourcePaths.itemAt(i));
25058ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i));
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
253603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    const Vector<Layer*>& layers = recorder.getLayers();
254603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < layers.size(); i++) {
255603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        mLayers.add(layers.itemAt(i));
256603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        caches.resourceCache.incrementRefcountLocked(layers.itemAt(i));
257603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
258603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
25958ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
26058ecc204fbcacef34806290492384677a330d4d4Romain Guy
26149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPaint*>& paints = recorder.getPaints();
262d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
263d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
264d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
265d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
26649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPath*>& paths = recorder.getPaths();
2672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2692fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2702fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
27149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkMatrix*>& matrices = recorder.getMatrices();
272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
27865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
27904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
280034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy    mFunctorCount = 0;
2816a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mLeft = 0;
2826a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mTop = 0;
2836a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mRight = 0;
2846a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mBottom = 0;
2856a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mClipChildren = true;
2866a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mAlpha = 1;
2876a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mMultipliedAlpha = 255;
2886a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mHasOverlappingRendering = true;
2896a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mTranslationX = 0;
2906a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mTranslationY = 0;
2916a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mRotation = 0;
2926a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mRotationX = 0;
2936a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mRotationY= 0;
2946a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mScaleX = 1;
2956a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mScaleY = 1;
2966a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mPivotX = 0;
2976a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mPivotY = 0;
2986a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mCameraDistance = 0;
2996a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mMatrixDirty = false;
3006a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mMatrixFlags = 0;
3016a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mPrevWidth = -1;
3026a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mPrevHeight = -1;
3036a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mWidth = 0;
3046a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mHeight = 0;
3056a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mPivotExplicitlySet = false;
3066a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase    mCaching = false;
30765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
30865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
30965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
31065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
326ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this,
327ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy            mName.string(), isRenderable());
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
3291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
33733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
33833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
33933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
34033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
4055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
415a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
416a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
417a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
418a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
4275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
428a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
43333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
43433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
4351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
445a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
454a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
462a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
477a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
480e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
481e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
482e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
483e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
484e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
485e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint);
486e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
487e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
512a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
513a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
514a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
515a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
516be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
517be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
5185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
519a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
5255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
535a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
547a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
556a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
557ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
558ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
563ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
566a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
579a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
601ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
602325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
603325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
604325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
605325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
606325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
607325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
608325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
609325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
610325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
611325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
612325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
613eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
614eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
615eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
616eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
617eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
6185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
619eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
621eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
622996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
623c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
624996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
62518edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t count = getInt();
62618edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float x = getFloat();
62718edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float y = getFloat();
62818edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t positionsCount = 0;
629996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
630996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
63118edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float length = getFloat();
632996e57c84368058be793897ebc355b917a59abc2Raph Levien                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
633996e57c84368058be793897ebc355b917a59abc2Raph Levien                        text.text(), text.length(), count, paint);
634996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
635996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
636ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
639ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
640ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
641ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
643ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
644ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
645ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
648ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
649ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
652ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
653ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
654ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
656ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
657ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
658ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
659ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
660ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
661ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
662ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6635baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
665ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
666ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
677ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
680ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
681ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
682ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7639d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7663561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase        if (!mHasOverlappingRendering) {
7673561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase            ALOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
7683561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase        } else {
7693561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
7703561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase            if (mClipChildren) {
7713561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
7723561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase            }
7733561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7743561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7753561d062ff01f3455c984e4cfcd101a64a2e902fChet Haase                    mMultipliedAlpha, flags);
776a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
781a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
782a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
783ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
790a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
791a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
792a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8249420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
8259420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
8291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
8311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
833a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8469d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8529d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
859a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
860a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
861a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
862ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
863ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
864ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
865ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
866ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8671271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
868486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
869b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
870b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
871b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
872ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
873ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
874ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
875ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
876ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
877ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
878ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
879a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
880a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
881a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
882a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
883ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
88513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8868a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8918a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8928a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
893b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
894b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
895b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
896486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
897b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
89813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8999c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
900ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
9018a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
9035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
90433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
905390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
90633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
90733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
90833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
90933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
91033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
91133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
91233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
91333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
91433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
9159c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
916ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
9178a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS
9188a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy        Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]);
9198a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif
9208a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
9215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
922daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
923daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
924daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
92513631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
9266554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
92713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
928daf98e941e140e8739458126640183b9f296a2abChet Haase            }
929daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
930b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
93133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
932daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
933daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
936b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
937daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
94233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
943daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
944daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
946b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
947b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
948daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
949daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
950daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
951daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
95333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
954daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
955a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
956daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
958b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
960daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
961daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
962daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
963daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
96433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
96533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
966daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
967a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
968daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
971b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
972daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
973daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
974daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
975daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
977b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
978b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
979daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
980daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
981daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
982b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
983b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
984b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
985daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
986daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
987daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
988daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
990b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
991807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
992daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
993daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
994daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
995daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
996807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
997807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
998b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
999daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
1000daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
1001daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
1002b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1003b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1004b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
1005daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
1006a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
1007a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
1008a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
1009a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
1010a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
1011a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
1012daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
1013b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1014b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1015b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
1016daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1018daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1019daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
102033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
1021daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
1022a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
1023daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
1024b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1025b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10260fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
1027daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
102833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
102933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
10301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
10311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
10320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
10330fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
10346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
1035d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                int oldAlpha = -1;
1036daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
1037daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1038daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1040d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
1041d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    oldAlpha = layer->getAlpha();
1042d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    layer->setAlpha(mMultipliedAlpha);
1043a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1044daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1045a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1046486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
1047d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (oldAlpha >= 0) {
1048d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    layer->setAlpha(oldAlpha);
1049d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                }
10506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1053d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                int oldAlpha = -1;
1054daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1055daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1056daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1058d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
1059d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    oldAlpha = paint->getAlpha();
1060b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1061b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1062daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1063a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1064486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1065d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (oldAlpha >= 0) {
1066d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    paint->setAlpha(oldAlpha);
1067d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                }
1068b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1069b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1070b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1071daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1072daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1074daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1075a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1076486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1077b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1078b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1079b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1081daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1082daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1083daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1084daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1085daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1086daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1087daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1090daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1091a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1092a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1093486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1095b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1096e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1097e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1098e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1099e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1100e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1101e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1102e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1103486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1104e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1105e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
11065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
110733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
11085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
11095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
11105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
11115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
11125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
11135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
11145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
111533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
11165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
11175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1118daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1119486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1120486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
11215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1122a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
11264bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
11294bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
11354bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
11379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
11389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
11399ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
11409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
1141be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1142be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
1143be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
11449ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1146486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1147be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        xDivsCount, yDivsCount, numColors, left, top, right, bottom,
1148be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        alpha, mode);
1149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
115233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
115333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1154daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1155486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1159daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1161daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1162daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1164daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1165a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1166486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
116901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1170daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1171daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1172daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1173daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1174daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1175daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1177daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1178a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1179486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
118001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
118101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
118201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1183daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1184daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1185daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1187daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1189486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
119001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
119101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1192c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1193daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1194daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1195daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1196daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1198daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1200486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1201c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1202c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
12038b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1204daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1205daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1206daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1207daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1208daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1209daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
121033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
12115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1212daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1214486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
12158b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
12168b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1218daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
12195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1220daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1221486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
122533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
12275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1228daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1229486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1232ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
123333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1234ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
12355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1236ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1237486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1238ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1239ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1240325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1241325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1242325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1243325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1244325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1245325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1246325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1247325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1248325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1249486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1250325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1251325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1252325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1253eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1254eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
125533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
125633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1257eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1259eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1260eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1261486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1262486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1263eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1264eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1265c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
1266996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
1267996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t count = getInt();
1268996e57c84368058be793897ebc355b917a59abc2Raph Levien                float x = getFloat();
1269996e57c84368058be793897ebc355b917a59abc2Raph Levien                float y = getFloat();
1270996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t positionsCount = 0;
1271996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
1272996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
1273996e57c84368058be793897ebc355b917a59abc2Raph Levien                float length = getFloat();
1274996e57c84368058be793897ebc355b917a59abc2Raph Levien                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1275996e57c84368058be793897ebc355b917a59abc2Raph Levien                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1276c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy                drawGlStatus |= renderer.drawText(text.text(), text.length(), count,
1277996e57c84368058be793897ebc355b917a59abc2Raph Levien                        x, y, positions, paint, length);
1278996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
1279996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
1280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1281daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1286daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1287daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1288daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1292daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1297daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1298daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1299daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1303daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1308daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1309daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1310daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
131133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1312daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1314daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1315daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1316daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
13175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
13185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
13195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
13205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
13215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
13225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
132333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
132433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
13255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
13265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
13275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
13285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
13295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1330daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1331daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1333daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1336ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
13371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
13381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
133913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
134013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
13426554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
13436554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1346b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
135058ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer():
135158ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE),
135254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false),
135354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mHasDrawOps(false), mFunctorCount(0) {
13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
136358ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.lock();
136458ecc204fbcacef34806290492384677a330d4d4Romain Guy
13655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
136658ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
13675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1368d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
136949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
137058ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i));
137149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
137249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1373d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
137458ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
1375d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1376d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
137743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
137858ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
137943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
138043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1381d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
138258ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
1383d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
138458ecc204fbcacef34806290492384677a330d4d4Romain Guy
1385603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < mLayers.size(); i++) {
1386603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
1387603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
1388603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
138958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.unlock();
139058ecc204fbcacef34806290492384677a330d4d4Romain Guy
139158ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
139258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
139358ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
1394d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1395d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
139658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
139758ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaderMap.clear();
139858ecc204fbcacef34806290492384677a330d4d4Romain Guy
139943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
140043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1401d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
14022fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
14032fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1404d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1405d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
140604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
1407603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    mLayers.clear();
1408603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
140904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
141054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount = 0;
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1417162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1418162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1419162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
14205977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1421162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
14225977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
142304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1424162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
14255977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
14265977baa1fa24125c148a72699b53e62abaf08960Chet Haase
142749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
142849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
142949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
143049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
14387c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guystatus_t DisplayListRenderer::prepareDirty(float left, float top,
14397d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1442b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
144345e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
1444b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
144545e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy    mDirtyClip = opaque;
144645e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
144727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
144845e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
144944b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
145027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
145127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
145227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
145327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
145433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1456b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1457daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1458daf98e941e140e8739458126640183b9f296a2abChet Haase}
1459daf98e941e140e8739458126640183b9f296a2abChet Haase
14602b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14636554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1464cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1465daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1466daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
146754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount++;
14686554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1469daf98e941e140e8739458126640183b9f296a2abChet Haase}
1470daf98e941e140e8739458126640183b9f296a2abChet Haase
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1472b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
147804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
147933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
148033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
148104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
148233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
148333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
148433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
148927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
149033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1500b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
15014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
15045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
15055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
15065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
15075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
15085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
15095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
15105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
15115b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
151333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
151433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
151533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
151633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1521b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
15234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
15304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1532807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1533807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1534807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1535807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1536807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1537807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1539b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1545b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
15484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
15514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1552b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
15554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
15564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15586554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
15591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1560cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1561cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1562b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1563b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
15640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
156533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
15666554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
15670fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
15680fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1569486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
15706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1571603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    addLayer(layer);
1572ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15736c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1574486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1577486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
1578a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(left, top,
1579a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy            left + bitmap->width(), top + bitmap->height());
158033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
158433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1585486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1588486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
159133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
159233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1593a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(r.left, r.top, r.right, r.bottom);
159433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
159833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1599486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1602486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
16034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
16045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
1605a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(dstLeft, dstTop, dstRight, dstBottom);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
16074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
16084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
16094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
16104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1612486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1615486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1616486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
1617a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(left, top,
1618a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy            left + bitmap->width(), top + bitmap->height());
1619e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1620e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1621e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1622e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1623e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1624486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1625e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1626e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1627486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
16285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
16295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
16305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
16315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
16325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
16335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
16345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
16355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
16365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
16375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
16385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
16395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
16405a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1641486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
16435a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1644486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1645486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1646486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
1647be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int alpha;
1648be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SkXfermode::Mode mode;
1649be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
1650be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1651a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(left, top, right, bottom);
165233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
16554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
16564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1658be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(alpha);
1659be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(mode);
166033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1661486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1664486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1665b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1668486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1671486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
16725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
167333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
1674a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy            quickRejectNoScissor(left, top, right, bottom);
167533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
16774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
167833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1679486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1682486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
168433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
1685a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy            quickRejectNoScissor(left, top, right, bottom);
168633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
168701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
168801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
168901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
169033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1691486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
169201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
169301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1694486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
169501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
169601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
169701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
169801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1699486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
170001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
170101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1702486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1703c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1704c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1705c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1706c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1707486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1708c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1709c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1710486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
17118b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
171282d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
17138b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
17148b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
17158b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
17168b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1717486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17188b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
17198b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1720486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
172133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
172233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
172333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
172433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
172595c21d0546e36ade3e0601394f5b625541836545Romain Guy    left -= offset;
172695c21d0546e36ade3e0601394f5b625541836545Romain Guy    top -= offset;
172795c21d0546e36ade3e0601394f5b625541836545Romain Guy
1728a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy    const bool reject = quickRejectNoScissor(left, top, left + width, top + height);
172933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
17304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
17314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
173233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1733486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1736486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1737b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
17384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
17394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1740486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1741ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1742ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1743486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1744ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1745ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1746ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1747486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1750996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1751996e57c84368058be793897ebc355b917a59abc2Raph Levien        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1752996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1753996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawTextOnPath);
1754996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1755996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1756996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPath(path);
1757996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(hOffset);
1758996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(vOffset);
1759996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1760e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1761e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1762e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1763996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1764996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1765996e57c84368058be793897ebc355b917a59abc2Raph Levien
1766996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1767996e57c84368058be793897ebc355b917a59abc2Raph Levien        const float* positions, SkPaint* paint) {
1768996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1769996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawPosText);
1770996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1771996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1772996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1773996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1774e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1775e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1776e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1777996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1778996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1779996e57c84368058be793897ebc355b917a59abc2Raph Levien
1780c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1781996e57c84368058be793897ebc355b917a59abc2Raph Levien        float x, float y, const float* positions, SkPaint* paint, float length) {
1782486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
178333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
17848f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
17858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
17868f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
17878f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
17888f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
17898f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1790c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
17918f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
179233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
179333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
179433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
179533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
179633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
179733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
1798a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy        reject = quickRejectNoScissor(x, y + metrics.fTop, x + length, y + metrics.fBottom);
179933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
180033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1801c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
180233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
180333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
1804996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(x);
1805996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(y);
1806996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1807e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1808e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    if (!reject) {
1809e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1810e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        fontRenderer.precache(addedPaint, text, count);
1811e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
181233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
181333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1814486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1815eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1816eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
18174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1818b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
18194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
18225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
18235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
18244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1827b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
18284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1831ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1832ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
18334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
18374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1840b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
18414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
18424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
18434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
18444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
18475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
18485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
18515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
18525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
18535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
18545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
18574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1858