DisplayListRenderer.cpp revision 54c1a64d5441a964890b44280e4457e11f4f924a
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
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
111b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mRight = 0;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
116db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    mHasOverlappingRendering = true;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
126b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mCameraDistance = 0;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
136a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
142bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
143bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
144d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix;
1481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformCamera;
1491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix3D;
1501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mStaticMatrix;
1511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mAnimationMatrix;
15258ecc204fbcacef34806290492384677a330d4d4Romain Guy
1531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
158a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
16054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    caches.unregisterFunctors(mFunctorCount);
16158ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
16458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1665977baa1fa24125c148a72699b53e62abaf08960Chet Haase
16749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
16849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
16958ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(bitmap);
17058ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(bitmap);
17149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
17249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
173d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
17458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
175d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
176d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17858ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
17958ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(mShaders.itemAt(i));
1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
18158ecc204fbcacef34806290492384677a330d4d4Romain Guy
18258ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < mSourcePaths.size(); i++) {
18358ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
18458ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
18558ecc204fbcacef34806290492384677a330d4d4Romain Guy
186603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < mLayers.size(); i++) {
187603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
188603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
189603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
19058ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1945977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1955977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1971af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1981af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1991af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
2002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
201d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
2025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
2035977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
2045977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
20558ecc204fbcacef34806290492384677a330d4d4Romain Guy
20658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
20758ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
20858ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
20958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
21058ecc204fbcacef34806290492384677a330d4d4Romain Guy    mSourcePaths.clear();
21158ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaints.clear();
21258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaths.clear();
2135977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
214603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    mLayers.clear();
2155977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
2165977baa1fa24125c148a72699b53e62abaf08960Chet Haase
217d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
22254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mFunctorCount = 0;
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
226d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
227d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
228d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
229d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
231d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
23265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
23365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
23565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
23754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount = recorder.getFunctorCount();
23854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
2395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
24054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    caches.registerFunctors(mFunctorCount);
24158ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
24349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
2445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
24758ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
25049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
25149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
25249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* resource = ownedBitmapResources.itemAt(i);
25349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        mOwnedBitmapResources.add(resource);
25458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
25549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
25649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
25749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
258d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
259d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
260d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
26158ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
262d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
263d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
26449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaShader*>& shaders = recorder.getShaders();
26524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
266d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
267d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
26858ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
26958ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
27058ecc204fbcacef34806290492384677a330d4d4Romain Guy
27158ecc204fbcacef34806290492384677a330d4d4Romain Guy    const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
27258ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < sourcePaths.size(); i++) {
27358ecc204fbcacef34806290492384677a330d4d4Romain Guy        mSourcePaths.add(sourcePaths.itemAt(i));
27458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i));
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
277603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    const Vector<Layer*>& layers = recorder.getLayers();
278603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < layers.size(); i++) {
279603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        mLayers.add(layers.itemAt(i));
280603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        caches.resourceCache.incrementRefcountLocked(layers.itemAt(i));
281603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
282603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
28358ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
28458ecc204fbcacef34806290492384677a330d4d4Romain Guy
28549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPaint*>& paints = recorder.getPaints();
286d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
287d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
288d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
289d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
29049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPath*>& paths = recorder.getPaths();
2912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
29549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkMatrix*>& matrices = recorder.getMatrices();
296d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
297d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
298d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
30265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
30304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
30465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
30565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
30665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
30765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
323ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this,
324ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy            mName.string(), isRenderable());
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
3261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
33433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
33533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
33633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
33733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3675baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
4025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
412a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
413a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
414a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
415a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
4245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
425a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
43033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
43133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
4321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
442a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
451a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
459a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
474a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
477e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
478e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
479e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
480e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
481e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
482e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint);
483e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
484e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4955baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
509a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
510a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
511a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
512a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
513be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
514be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
5155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
516a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
5225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
532a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
544a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
553a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
555ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
556ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
557ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
558ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
563a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
564ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
565ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
576a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
598ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
599325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
600325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
601325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
602325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
603325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
604325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
605325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
606325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
607325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
608325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
609325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
610eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
611eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
612eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
613eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
614eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
6155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
616eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
617a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
618eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
619996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
620c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
621996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
62218edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t count = getInt();
62318edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float x = getFloat();
62418edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float y = getFloat();
62518edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t positionsCount = 0;
626996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
627996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
62818edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float length = getFloat();
629996e57c84368058be793897ebc355b917a59abc2Raph Levien                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
630996e57c84368058be793897ebc355b917a59abc2Raph Levien                        text.text(), text.length(), count, paint);
631996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
632996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
633ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
636ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
637ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
640ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
641ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
642ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
644ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
645ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
646ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
649ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
651ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
653ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
654ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
655ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
656ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
657ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
658ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
659ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
662ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
663ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
674ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
677ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
678ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
679ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7609d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
777a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
778a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
779ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
781a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
782a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
783a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
784a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
8219420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
8241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
829a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8429d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8489d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
855a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
856a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
857a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
858ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
859ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
860ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
861ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
862ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8631271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
864486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
868ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
869ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
870ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
871ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
872ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
873ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
874ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
875a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
876a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
877a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
878a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
879ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
880b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
88113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8828a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8878a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8888a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
889b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
890b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
891b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
892486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
893b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
89413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
896ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
8978a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
898b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
90033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
901390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
90233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
90333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
90433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
90533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
90633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
90733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
90833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
90933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
91033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
9119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
912ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
9138a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS
9148a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy        Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]);
9158a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif
9168a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
9175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
918daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
919daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
920daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
92113631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
9226554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
92313631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
924daf98e941e140e8739458126640183b9f296a2abChet Haase            }
925daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
926b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
92733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
928daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
929daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
930b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
931b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
933daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
936b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
93833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
939daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
940daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
942b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
944daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
945daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
946daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
947daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
94933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
950daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
951a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
952daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
953b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
954b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
956daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
957daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
958daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
959daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
96033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
96133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
962daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
963a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
964daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
967b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
968daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
969daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
970daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
971daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
972b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
973b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
974b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
975daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
976daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
977daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
978b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
979b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
980b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
981daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
982daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
983daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
984daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
985b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
987807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
988daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
989daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
990daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
991daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
992807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
993807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
994b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
995daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
996daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
997daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
998b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
999b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
1001daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
1003a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
1004a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
1005a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
1006a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
1007a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
1008daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
1009b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1010b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1011b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
1012daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1013daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1014daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1015daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
101633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
1018a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
1019daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
1020b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1021b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
1023daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
102433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
102533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
10261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
10271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
10280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
10290fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
10306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
1031d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                int oldAlpha = -1;
1032daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
1033daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1034daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1036d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
1037d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    oldAlpha = layer->getAlpha();
1038d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    layer->setAlpha(mMultipliedAlpha);
1039a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1040daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1041a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1042486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
1043d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (oldAlpha >= 0) {
1044d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    layer->setAlpha(oldAlpha);
1045d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                }
10466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1049d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                int oldAlpha = -1;
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1051daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1052daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1054d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
1055d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    oldAlpha = paint->getAlpha();
1056b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1057b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1058daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1059a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1060486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1061d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                if (oldAlpha >= 0) {
1062d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                    paint->setAlpha(oldAlpha);
1063d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase                }
1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1065b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1067daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1068daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1070daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1071a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1072486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1073b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1074b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1076daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1077daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1078daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1081daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1082daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1083daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1084daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1086daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1087a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1088a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1089486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1090b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1091b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1092e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1093e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1094e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1095e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1096e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1097e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1098e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1099486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1100e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1101e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
11025a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
110333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
11045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
11055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
11065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
11075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
11085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
11095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
11105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
111133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
11125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
11135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1114daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1115486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1116486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
11175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1118a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
11224bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
11254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
11314bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
11339ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
11349ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
11359ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
11369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
1137be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1138be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
1139be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
11409ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1141daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1142486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1143be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        xDivsCount, yDivsCount, numColors, left, top, right, bottom,
1144be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        alpha, mode);
1145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
114833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
114933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1150daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1151486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1155daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1156daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1158daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1162486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
116501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1166daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1167daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1168daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1169daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1170daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1171daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1173daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1174a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1175486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
117601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
117701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
117801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1180daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1181daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1183daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1184a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1185486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
118601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
118701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1188c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1189daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1191daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1192daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1194daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1196486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1197c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1198c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11998b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1200daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1202daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1203daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1204daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1205daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
120633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
12075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1208daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1210486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
12118b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
12128b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1214daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
12155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1216daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1217486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
122133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
12235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1224daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1225486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1228ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
122933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1230ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
12315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1232ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1233486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1234ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1235ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1236325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1237325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1238325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1239325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1240325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1241325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1242325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1243325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1244325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1245486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1246325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1247325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1248325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1249eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1250eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
125133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
125233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1253eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1255eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1256eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1257486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1258486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1259eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1260eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1261c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
1262996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
1263996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t count = getInt();
1264996e57c84368058be793897ebc355b917a59abc2Raph Levien                float x = getFloat();
1265996e57c84368058be793897ebc355b917a59abc2Raph Levien                float y = getFloat();
1266996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t positionsCount = 0;
1267996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
1268996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
1269996e57c84368058be793897ebc355b917a59abc2Raph Levien                float length = getFloat();
1270996e57c84368058be793897ebc355b917a59abc2Raph Levien                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1271996e57c84368058be793897ebc355b917a59abc2Raph Levien                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1272c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy                drawGlStatus |= renderer.drawText(text.text(), text.length(), count,
1273996e57c84368058be793897ebc355b917a59abc2Raph Levien                        x, y, positions, paint, length);
1274996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
1275996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
1276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1277daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1282daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1283daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1284daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1288daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1293daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1294daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1295daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1299daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1304daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1305daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1306daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
130733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1308daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1310daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1311daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1312daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
13135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
13145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
13155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
13165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
13175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
13185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
131933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
132033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
13215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
13225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
13235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
13245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
13255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1326daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1327daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1329daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1332ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
13331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
13341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
133513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
133613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
13386554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
13396554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1340b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
13434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
13444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
134658ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer():
134758ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE),
134854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false),
134954c1a64d5441a964890b44280e4457e11f4f924aRomain Guy        mHasDrawOps(false), mFunctorCount(0) {
13504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
135958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.lock();
136058ecc204fbcacef34806290492384677a330d4d4Romain Guy
13615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
136258ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
13635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1364d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
136549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
136658ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i));
136749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
136849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1369d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
137058ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
1371d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1372d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
137343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
137458ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
137543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
137643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1377d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
137858ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
1379d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
138058ecc204fbcacef34806290492384677a330d4d4Romain Guy
1381603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    for (size_t i = 0; i < mLayers.size(); i++) {
1382603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase        mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i));
1383603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    }
1384603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
138558ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.unlock();
138658ecc204fbcacef34806290492384677a330d4d4Romain Guy
138758ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
138858ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
138958ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
1390d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1391d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
139258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
139358ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaderMap.clear();
139458ecc204fbcacef34806290492384677a330d4d4Romain Guy
139543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
139643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1397d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
13982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
13992fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1400d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1401d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
140204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
1403603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    mLayers.clear();
1404603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase
140504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
140654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount = 0;
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1413162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1414162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1415162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
14165977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1417162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
14185977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
141904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1420162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
14215977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
14225977baa1fa24125c148a72699b53e62abaf08960Chet Haase
142349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
142449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
142549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
142649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1429b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1430b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
143444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haaseint DisplayListRenderer::prepareDirty(float left, float top,
14357d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
143945e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
1440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
144145e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy    mDirtyClip = opaque;
144245e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
144327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
144445e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy
144544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
144627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
144727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
144827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
144927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
145033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1451b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1452b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1453daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1454daf98e941e140e8739458126640183b9f296a2abChet Haase}
1455daf98e941e140e8739458126640183b9f296a2abChet Haase
14562b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14596554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1460cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1461daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1462daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
146354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy    mFunctorCount++;
14646554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1465daf98e941e140e8739458126640183b9f296a2abChet Haase}
1466daf98e941e140e8739458126640183b9f296a2abChet Haase
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
147404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
147633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
147704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
147833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
147933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
148033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
148527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
148633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1492b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
15005b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
15015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
15025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
15035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
15045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
15055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
15065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
15075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
150933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
151133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
151233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
15144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1517b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1528807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1529807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1530807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1531807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1532807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1533807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
15344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
15364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1541b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
15444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
15474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1548b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
15494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
15514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
15524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15546554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
15551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1556cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1557cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1558b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1559b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
15600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
156133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
15626554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
15630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
15640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1565486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
15666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1567603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase    addLayer(layer);
1568ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1570486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1573486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
157433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
157533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
157933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1580486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1583486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
158433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
158533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
158633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
158733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
158833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
159333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1594486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1597486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
15984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
15995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
160033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
160133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
16024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
16034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
16044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
16054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1607486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1610486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1611486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
161295c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
1613e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1614e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1615e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1616e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1617e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1618486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1619e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1620e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1621486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
16225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
16235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
16245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
16255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
16265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
16275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
16285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
16295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
16305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
16315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
16325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
16335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
16345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1635486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
16375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1638486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1639486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1640486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
1641be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int alpha;
1642be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SkXfermode::Mode mode;
1643be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
1644be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
164533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
164633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
16474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
16504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
16514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1652be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(alpha);
1653be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(mode);
165433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1655486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1658486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1659b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
16604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1662486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1665486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
16665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
166733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
166833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
166933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
16704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
16714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
167233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1673486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1676486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
167833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
167933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
168033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
168101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
168201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
168301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
168433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1685486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
168601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
168701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1688486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
168901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
169001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
169101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
169201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1693486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
169401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
169501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1696486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1697c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1698c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1699c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1700c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1701486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1702c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1703c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1704486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
17058b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
170682d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
17078b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
17088b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
17098b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
17108b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1711486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17128b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
17138b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1714486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
171533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
171633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
171733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
171833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
171995c21d0546e36ade3e0601394f5b625541836545Romain Guy    left -= offset;
172095c21d0546e36ade3e0601394f5b625541836545Romain Guy    top -= offset;
172195c21d0546e36ade3e0601394f5b625541836545Romain Guy
172295c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + width, top + height);
172333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
17244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
17254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
172633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1727486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1730486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1731b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
17324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
17334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1734486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1735ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1736ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1737486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1738ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1739ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1740ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1741486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1744996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1745996e57c84368058be793897ebc355b917a59abc2Raph Levien        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1746996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1747996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawTextOnPath);
1748996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1749996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1750996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPath(path);
1751996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(hOffset);
1752996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(vOffset);
1753996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1754e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1755e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1756e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1757996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1758996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1759996e57c84368058be793897ebc355b917a59abc2Raph Levien
1760996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1761996e57c84368058be793897ebc355b917a59abc2Raph Levien        const float* positions, SkPaint* paint) {
1762996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1763996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawPosText);
1764996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1765996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1766996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1767996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1768e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1769e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1770e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1771996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1772996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1773996e57c84368058be793897ebc355b917a59abc2Raph Levien
1774c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1775996e57c84368058be793897ebc355b917a59abc2Raph Levien        float x, float y, const float* positions, SkPaint* paint, float length) {
1776486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
177733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
17788f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
17798f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
17808f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
17818f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
17828f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
17838f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1784c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
17858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
178633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
178733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
178833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
178933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
179033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
179133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
179233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
179333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
179433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1795c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
179633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
179733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
1798996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(x);
1799996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(y);
1800996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1801e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1802e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    if (!reject) {
1803e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1804e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        fontRenderer.precache(addedPaint, text, count);
1805e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
180633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
180733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1808486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1809eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1810eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
18114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1812b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
18134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
18165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
18175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
18184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1821b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
18224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1825ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1826ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
18274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1830b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
18314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1834b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
18354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
18364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
18374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
18384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
18415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
18425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
18455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
18465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
18475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
18485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
18514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1852