DisplayListRenderer.cpp revision 58ecc204fbcacef34806290492384677a330d4d4
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();
16058ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
16358ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase
16649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
16749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
16858ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(bitmap);
16958ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(bitmap);
17049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
17149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
172d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
17358ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
175d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17758ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
17858ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.destructorLocked(mShaders.itemAt(i));
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
18058ecc204fbcacef34806290492384677a330d4d4Romain Guy
18158ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < mSourcePaths.size(); i++) {
18258ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
18358ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
18458ecc204fbcacef34806290492384677a330d4d4Romain Guy
18558ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
1865977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1921af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1931af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1941af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
196d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
1975977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1985977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1995977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
20058ecc204fbcacef34806290492384677a330d4d4Romain Guy
20158ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
20258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
20358ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
20458ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
20558ecc204fbcacef34806290492384677a330d4d4Romain Guy    mSourcePaths.clear();
20658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaints.clear();
20758ecc204fbcacef34806290492384677a330d4d4Romain Guy    mPaths.clear();
2085977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
2095977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
2105977baa1fa24125c148a72699b53e62abaf08960Chet Haase
211d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
219d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
220d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
221d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
222d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
224d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
22565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
22665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
22865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
23158ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.lock();
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
23349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
2345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
23758ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
24049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
24149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
24249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* resource = ownedBitmapResources.itemAt(i);
24349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        mOwnedBitmapResources.add(resource);
24458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
24549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
24649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
24749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
248d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
249d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
250d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
25158ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
252d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
253d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
25449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaShader*>& shaders = recorder.getShaders();
25524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
256d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
257d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
25858ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(resource);
25958ecc204fbcacef34806290492384677a330d4d4Romain Guy    }
26058ecc204fbcacef34806290492384677a330d4d4Romain Guy
26158ecc204fbcacef34806290492384677a330d4d4Romain Guy    const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
26258ecc204fbcacef34806290492384677a330d4d4Romain Guy    for (size_t i = 0; i < sourcePaths.size(); i++) {
26358ecc204fbcacef34806290492384677a330d4d4Romain Guy        mSourcePaths.add(sourcePaths.itemAt(i));
26458ecc204fbcacef34806290492384677a330d4d4Romain Guy        caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i));
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
26758ecc204fbcacef34806290492384677a330d4d4Romain Guy    caches.resourceCache.unlock();
26858ecc204fbcacef34806290492384677a330d4d4Romain Guy
26949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPaint*>& paints = recorder.getPaints();
270d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
271d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
27449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPath*>& paths = recorder.getPaths();
2752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2772fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2782fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
27949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkMatrix*>& matrices = recorder.getMatrices();
280d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
281d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
282d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
28665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
28704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
28865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
28965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
29065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
29165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
307ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this,
308ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy            mName.string(), isRenderable());
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
3101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
31833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
31933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
32033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
32133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3865baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
396a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
397a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
398a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
399a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
4085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
409a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
41433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
41533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
4161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
426a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
435a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
443a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
458a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
461e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
462e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
463e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
464e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
465e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
466e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint);
467e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
468e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4795baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
493a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
494a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
495a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
496a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
497be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
498be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
4995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
500a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
5065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
528a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
537a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
547a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
555ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
556ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
557ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5595baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
560a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
563ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
564ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
583325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
584325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
585325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
586325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
587325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
588325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
589325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
590325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
591325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
594eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
595eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
596eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
597eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
598eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
600eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
601a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
602eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
603996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
604c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
605996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
60618edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t count = getInt();
60718edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float x = getFloat();
60818edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float y = getFloat();
60918edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t positionsCount = 0;
610996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
611996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
61218edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float length = getFloat();
613996e57c84368058be793897ebc355b917a59abc2Raph Levien                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
614996e57c84368058be793897ebc355b917a59abc2Raph Levien                        text.text(), text.length(), count, paint);
615996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
616996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
619ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
620ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
621ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
622ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6235baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
624ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
625ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
626ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
628ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
629ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
630ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
631ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
633ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
634ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
637ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
639ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
640ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
641ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
642ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
643ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
646ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
658ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6595baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
661ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
662ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
663ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7379420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7449d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
751a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
753a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
763ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8049420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
8059420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
813a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8269d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8329d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
839a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
840a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
841a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
842ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
843ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
844ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
845ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
846ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8471271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
848486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
849b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
850b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
851b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
852ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
853ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
854ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
855ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
856ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
857ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
858ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
859a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
860a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
861a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
862a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
863ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
864b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
86513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8668a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8718a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8728a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
873b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
874b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
875b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
876486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
877b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
87813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
880ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
8818a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
885390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
88633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
88733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
88833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
88933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
89033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
89133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
89233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
89333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
89433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
896ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8978a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS
8988a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy        Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]);
8998a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif
9008a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
9015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
902daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
903daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
904daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
90513631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
9066554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
90713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
908daf98e941e140e8739458126640183b9f296a2abChet Haase            }
909daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
91133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
913daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
914b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
915b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
916b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
917daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
920b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
921b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
92233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
923daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
924daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
925b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
926b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
927b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
928daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
929daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
930daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
931daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
93333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
934daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
935a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
936daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
940daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
941daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
942daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
943daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
94433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
94533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
946daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
947a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
948daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
952daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
953daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
954daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
955daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
958b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
959daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
960daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
961daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
964b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
965daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
966daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
967daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
968daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
969b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
970b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
971807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
972daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
973daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
974daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
975daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
976807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
977807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
978b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
979daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
980daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
981daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
982b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
983b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
984b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
985daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
986a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
987a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
988a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
989a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
990a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
991a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
992daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
993b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
994b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
995b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
996daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
997daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
998daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
999daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
100033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
1001daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
1004b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1005b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10060fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
1007daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
100833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
100933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
10101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
10111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
10120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
10130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
10146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
1015daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
1016daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10196f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1020a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1021a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1022daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1023a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1024486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
10256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1027b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1028daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1029daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1030daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10326f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1033b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1034b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1035daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1036a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1037486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1038b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1039b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1040b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1041daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1042daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1044daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1045a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1046486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1049b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1051daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1052daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1053daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1054daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1055daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1056daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1057daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1058daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1060daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1061a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1062a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1063486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1065b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1066e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1067e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1068e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1069e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1070e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1071e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1072e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1073486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1074e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1075e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
10765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
107733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10785a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10795a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10815a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10825a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
108533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1089486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1090486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
10915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1092a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1093b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1095b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10964bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1097b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1098b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1100b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1101b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
11054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
11079ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
11089ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
11099ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
11109ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
1111be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1112be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
1113be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
11149ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1115daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1116486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1117be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        xDivsCount, yDivsCount, numColors, left, top, right, bottom,
1118be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        alpha, mode);
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
112233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
112333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1125486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1129daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1130daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1131daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1132daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1134daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1136486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
113901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1140daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1141daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1142daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1143daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1144daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1147daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1148a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1149486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
115001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
115101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
115201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1153daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1154daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1155daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1158a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1159486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
116001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
116101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1162c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1163daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1164daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1165daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1166daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1168daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1169a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1170486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1171c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1172c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11738b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1174daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1175daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1176daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1177daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1178daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
118033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1182daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1184486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11858b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11868b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1188daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1191486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
119533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1198daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1199486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1202ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
120333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1204ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
12055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1206ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1207486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1208ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1209ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1210325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1211325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1212325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1213325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1214325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1215325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1216325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1217325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1218325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1219486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1220325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1221325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1222325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1223eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1224eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
122533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
122633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1227eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1229eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1230eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1231486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1232486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1233eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1234eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1235c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
1236996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
1237996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t count = getInt();
1238996e57c84368058be793897ebc355b917a59abc2Raph Levien                float x = getFloat();
1239996e57c84368058be793897ebc355b917a59abc2Raph Levien                float y = getFloat();
1240996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t positionsCount = 0;
1241996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
1242996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
1243996e57c84368058be793897ebc355b917a59abc2Raph Levien                float length = getFloat();
1244996e57c84368058be793897ebc355b917a59abc2Raph Levien                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1245996e57c84368058be793897ebc355b917a59abc2Raph Levien                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1246c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy                drawGlStatus |= renderer.drawText(text.text(), text.length(), count,
1247996e57c84368058be793897ebc355b917a59abc2Raph Levien                        x, y, positions, paint, length);
1248996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
1249996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
1250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1251daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1256daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1257daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1258daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1262daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1267daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1268daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1269daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1273daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1278daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1279daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1280daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
128133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1282daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1284daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1285daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1286daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
129333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
129433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1300daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1301daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1303daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1306ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
13071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
13081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
130913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
131013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
13126554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
13136554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
13174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
13184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
132058ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer():
132158ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE),
132233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
13234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
133258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.lock();
133358ecc204fbcacef34806290492384677a330d4d4Romain Guy
13345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
133558ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i));
13365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1337d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
133849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
133958ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i));
134049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
134149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1342d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
134358ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i));
1344d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1345d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
134643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
134758ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i));
134843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
134943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1350d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
135158ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i));
1352d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
135358ecc204fbcacef34806290492384677a330d4d4Romain Guy
135458ecc204fbcacef34806290492384677a330d4d4Romain Guy    mCaches.resourceCache.unlock();
135558ecc204fbcacef34806290492384677a330d4d4Romain Guy
135658ecc204fbcacef34806290492384677a330d4d4Romain Guy    mBitmapResources.clear();
135758ecc204fbcacef34806290492384677a330d4d4Romain Guy    mOwnedBitmapResources.clear();
135858ecc204fbcacef34806290492384677a330d4d4Romain Guy    mFilterResources.clear();
1359d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1360d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
136158ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaders.clear();
136258ecc204fbcacef34806290492384677a330d4d4Romain Guy    mShaderMap.clear();
136358ecc204fbcacef34806290492384677a330d4d4Romain Guy
136443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
136543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1366d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
13672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
13682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1369d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1370d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
137104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
137204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1379162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1380162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1381162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13825977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1383162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13845977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
138504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1386162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13875977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13885977baa1fa24125c148a72699b53e62abaf08960Chet Haase
138949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
139049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
139149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
139249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
140044b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haaseint DisplayListRenderer::prepareDirty(float left, float top,
14017d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1403b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
140627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
140744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
140827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
140927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
141027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
141127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
141233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1415daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1416daf98e941e140e8739458126640183b9f296a2abChet Haase}
1417daf98e941e140e8739458126640183b9f296a2abChet Haase
14182b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14216554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1422cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1423daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1424daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
14256554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1426daf98e941e140e8739458126640183b9f296a2abChet Haase}
1427daf98e941e140e8739458126640183b9f296a2abChet Haase
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1429b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
143504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
143633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
143733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
143804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
143933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
144033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
144133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
144627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
144733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1457b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
14615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
14625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
14635b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
14645b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
14655b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
14665b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
14675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
14685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
147033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
147133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
147233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
147333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1489807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1490807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1491807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1492807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1493807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1494807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1502b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
15034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
15054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1509b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
15104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15156554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
15161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1517cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1518cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1519b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1520b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
15210fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
15236554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
15240fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
15250fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1526486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
15276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1528ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1529ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1531486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1534486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
153533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
153633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
154033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1541486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1544486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
154533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
154633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
154733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
154833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
154933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
155033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
155433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1555486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1558486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
15594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
15605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
156133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
156233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
15634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
15654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
15664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
156733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1568486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1571486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1572486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
157395c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
1574e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1575e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1576e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1577e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1578e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1579486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1580e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1581e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1582486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
15835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
15845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
15855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
15865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
15875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
15885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
15895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
15905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
15915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1596486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1599486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1600486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1601486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
1602be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int alpha;
1603be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SkXfermode::Mode mode;
1604be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
1605be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
160733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
16084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
16094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
16104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
16114bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
16124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1613be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(alpha);
1614be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(mode);
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1616486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1619486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1620b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
16214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1623486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1626486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
16275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
162833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
162933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
163033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
16314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
16324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
163333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1634486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1637486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
163933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
164033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
164133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
164201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
164301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
164401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
164533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1646486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
164701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
164801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1649486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
165001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
165101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
165201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
165301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1654486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
165501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
165601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1657486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1658c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1659c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1660c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1661c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1662486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1663c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1664c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1665486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
16668b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
166782d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
16688b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
16698b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
16708b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
16718b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1672486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16738b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
16748b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1675486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
167633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
167733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
167833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
167933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
168095c21d0546e36ade3e0601394f5b625541836545Romain Guy    left -= offset;
168195c21d0546e36ade3e0601394f5b625541836545Romain Guy    top -= offset;
168295c21d0546e36ade3e0601394f5b625541836545Romain Guy
168395c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + width, top + height);
168433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
16854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
16864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
168733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1688486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1691486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1692b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
16934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
16944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1695486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1696ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1697ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1698486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1699ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1700ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1701ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1702486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1705996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1706996e57c84368058be793897ebc355b917a59abc2Raph Levien        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1707996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1708996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawTextOnPath);
1709996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1710996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1711996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPath(path);
1712996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(hOffset);
1713996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(vOffset);
1714996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1715e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1716e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1717e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1718996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1719996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1720996e57c84368058be793897ebc355b917a59abc2Raph Levien
1721996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1722996e57c84368058be793897ebc355b917a59abc2Raph Levien        const float* positions, SkPaint* paint) {
1723996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1724996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawPosText);
1725996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1726996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1727996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1728996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1729e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1730e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1731e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    fontRenderer.precache(addedPaint, text, count);
1732996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1733996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1734996e57c84368058be793897ebc355b917a59abc2Raph Levien
1735c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1736996e57c84368058be793897ebc355b917a59abc2Raph Levien        float x, float y, const float* positions, SkPaint* paint, float length) {
1737486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
173833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
17398f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
17408f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
17418f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
17428f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
17438f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
17448f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1745c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
17468f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
174733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
174833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
174933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
175033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
175133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
175233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
175333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
175433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
175533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1756c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
175733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
175833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
1759996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(x);
1760996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(y);
1761996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1762e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    SkPaint* addedPaint = addPaint(paint);
1763e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    if (!reject) {
1764e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint);
1765e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        fontRenderer.precache(addedPaint, text, count);
1766e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase    }
176733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
176833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1769486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1770eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1771eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
17724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1773b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
17744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
17775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
17785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
17794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1782b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
17834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1786ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1787ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
17884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1791b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
17924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1795b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
17964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
17974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
17984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
17994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
18004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
18015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
18025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
18035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
18065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
18075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
18085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
18095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
18105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
18114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
18124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1813