DisplayListRenderer.cpp revision 18edb81172daa9b98b53d226d94fc03249b1aded
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;
1521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
157a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase
16549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
16649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
16749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.decrementRefcount(bitmap);
16849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.destructor(bitmap);
16949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
17049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    mOwnedBitmapResources.clear();
17149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
172d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
173d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
175d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
176d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
179d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
18124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1825977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1835977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1845977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1855977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1865977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1891af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1901af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1911af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
195d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
196d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
197d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
198d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
199d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
2005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
2015977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
2025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
2035977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
2045977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
2055977baa1fa24125c148a72699b53e62abaf08960Chet Haase
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
214d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
215d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
216d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
217d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
219d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
22065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
22165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
22365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
22749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
2285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
233d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
23449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
23549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
23649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* resource = ownedBitmapResources.itemAt(i);
23749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        mOwnedBitmapResources.add(resource);
23849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.incrementRefcount(resource);
23949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
24049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
24149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
242d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
243d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
244d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
245d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
246d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
247d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
24849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaShader*>& shaders = recorder.getShaders();
24924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
250d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
251d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
252d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
25549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPaint*>& paints = recorder.getPaints();
256d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
257d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
258d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
259d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
26049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPath*>& paths = recorder.getPaths();
2612fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
26549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
266d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < sourcePaths.size(); i++) {
267d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        mSourcePaths.add(sourcePaths.itemAt(i));
268d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.incrementRefcount(sourcePaths.itemAt(i));
269d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
270d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
27149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkMatrix*>& matrices = recorder.getMatrices();
272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
27865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
27904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
28065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
28165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
28265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
28365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
299ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this,
300ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy            mName.string(), isRenderable());
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
3021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
31033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
31133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
31233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
31333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
390a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
4005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
401a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
40633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
40733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
4081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
418a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
435a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
450a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
453e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
454e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
455e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
456e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
457e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
458e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint);
459e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
460e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
485a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
486a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
487a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
488a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
489be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
490be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
4915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
492a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
520a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
529a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
539a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
552a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
555ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
556ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
563ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
575325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
576325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
577325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
578325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
579325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
580325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
581325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
582325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
583325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
584325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
585325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
586eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
587eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
588eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
589eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
590eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
592eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
593a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
594eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
595996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
596c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
597996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
59818edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t count = getInt();
59918edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float x = getFloat();
60018edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float y = getFloat();
60118edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                int32_t positionsCount = 0;
602996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
603996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
60418edb81172daa9b98b53d226d94fc03249b1adedRomain Guy                float length = getFloat();
605996e57c84368058be793897ebc355b917a59abc2Raph Levien                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
606996e57c84368058be793897ebc355b917a59abc2Raph Levien                        text.text(), text.length(), count, paint);
607996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
608996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
609ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
611ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
612ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
613ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
620ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
621ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
622ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
623ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
625ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
626ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
627ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
629ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
630ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
631ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
632ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
633ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
634ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
639ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
653ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
654ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
655ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
7031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7299420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7369d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
743a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
745a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
753a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
754a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
755ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7969420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
805a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8189d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8249d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
831a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
832a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
833a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
834ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
835ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
836ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
837ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
838ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8391271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
840486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
841b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
842b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
843b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
844ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
845ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
846ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
847ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
848ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
849ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
850ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
851a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
852a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
853a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
854a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
855ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
856b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
85713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8588a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8638a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8648a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy    if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) {
865b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
866b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
867b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
868486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
869b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
87013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8719c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
872ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
8738a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
874b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
87633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
877390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
87833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
87933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
88033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
88133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
88233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
88333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
88533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
88633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8879c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
888ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8898a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS
8908a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy        Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]);
8918a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif
8928a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy
8935b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
894daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
895daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
896daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
89713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8986554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
89913631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
900daf98e941e140e8739458126640183b9f296a2abChet Haase            }
901daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
90333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
904daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
905daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
906b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
909daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
911b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
912b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
913b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
91433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
915daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
916daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
917b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
920daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
921daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
922daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
923daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
92533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
926daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
927a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
928daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
929b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
930b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
932daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
933daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
934daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
935daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
93633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
93733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
938daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
939a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
940daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
944daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
945daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
946daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
947daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
948b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
949b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
951daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
952daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
953daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
954b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
955b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
957daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
958daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
959daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
960daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
961b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
963807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
964daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
965daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
966daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
967daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
968807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
969807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
970b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
971daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
972daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
973daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
974b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
975b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
977daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
978a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
979a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
980a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
981a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
982a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
983a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
984daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
985b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
987b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
988daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
989daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
990daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
991daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
99233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
993daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
994a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
995daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
996b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9980fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
999daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
100033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
100133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
10021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
10031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
10040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
10050fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
10066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
1007daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
1008daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1009daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10116f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1012a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1013a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1014daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1015a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1016486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
10176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1019b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1020daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1021daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1022daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10246f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1025b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1026b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1027daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1028a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1029486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1031b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1032b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1033daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1034daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1036daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1037a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1038486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1039b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1040b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1041b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1042daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1043daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1044daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1045daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1046daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1047daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1048daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1049daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1052daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1053a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1054a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1055486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1056b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1057b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1058e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1059e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1060e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1061e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1062e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1063e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1064e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1065486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1066e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1067e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
10685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
106933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
107733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10795a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1081486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1082486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
10835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1084a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1085b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1086b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1087b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1089b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1090b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1092b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1093b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1095b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1096b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1098b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10999ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
11009ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
11019ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
11029ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
1103be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1104be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
1105be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
11069ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1107daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1108486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1109be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        xDivsCount, yDivsCount, numColors, left, top, right, bottom,
1110be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        alpha, mode);
1111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
111433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
111533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1116daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1117486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1121daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1126daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1128486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
113101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1132daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1133daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1134daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1135daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1136daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1137daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1139daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1140a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1141486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
114201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
114301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
114401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1146daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1147daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1149daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1150a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1151486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
115201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
115301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1154c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1155daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1156daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1158daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1162486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1163c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1164c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11658b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1166daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1167daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1168daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1169daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1170daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1171daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
117233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1174daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1175a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1176486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11778b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11788b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1180daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1182daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1183486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
118733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1191486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1194ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
119533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1196ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1198ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1199486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1200ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1201ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1202325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1203325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1204325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1205325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1206325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1207325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1208325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1209325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1210325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1211486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1212325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1213325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1214325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1215eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1216eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
121733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
121833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1219eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1221eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1222eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1223486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1224486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1225eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1226eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1227c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy            case DrawText: {
1228996e57c84368058be793897ebc355b917a59abc2Raph Levien                getText(&text);
1229996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t count = getInt();
1230996e57c84368058be793897ebc355b917a59abc2Raph Levien                float x = getFloat();
1231996e57c84368058be793897ebc355b917a59abc2Raph Levien                float y = getFloat();
1232996e57c84368058be793897ebc355b917a59abc2Raph Levien                int32_t positionsCount = 0;
1233996e57c84368058be793897ebc355b917a59abc2Raph Levien                float* positions = getFloats(positionsCount);
1234996e57c84368058be793897ebc355b917a59abc2Raph Levien                SkPaint* paint = getPaint(renderer);
1235996e57c84368058be793897ebc355b917a59abc2Raph Levien                float length = getFloat();
1236996e57c84368058be793897ebc355b917a59abc2Raph Levien                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1237996e57c84368058be793897ebc355b917a59abc2Raph Levien                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1238c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy                drawGlStatus |= renderer.drawText(text.text(), text.length(), count,
1239996e57c84368058be793897ebc355b917a59abc2Raph Levien                        x, y, positions, paint, length);
1240996e57c84368058be793897ebc355b917a59abc2Raph Levien            }
1241996e57c84368058be793897ebc355b917a59abc2Raph Levien            break;
1242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1243daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1248daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1249daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1250daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1254daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1259daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1260daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1261daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1265daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1266b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1267b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1270daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1271daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1272daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
127333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1274daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1276daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1277daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1278daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
128533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
128633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1292daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1293daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1295daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1298ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
12991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
13001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
130113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
130213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
13046554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
13056554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
13094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
13104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
131333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
13144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
13235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
13245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1325d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
13265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
13275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1328d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
132949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
133049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
133149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.decrementRefcount(bitmap);
133249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
133349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    mOwnedBitmapResources.clear();
133449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1335d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1336d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1337d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1338d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1339d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
134043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1341d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
134243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
134324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
134424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
134543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1346d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
1347d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
1348d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
1349d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1350d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
135143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
135243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1353d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
13542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
13552fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1356d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1357d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
135804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
135904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1366162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1367162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1368162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13695977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1370162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13715977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
137204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1373162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13745977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13755977baa1fa24125c148a72699b53e62abaf08960Chet Haase
137649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
137749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
137849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
137949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1381b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1382b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
138744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haaseint DisplayListRenderer::prepareDirty(float left, float top,
13887d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1391b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1392b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
139327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
139444b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
139527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
139627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
139727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
139827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
139933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1401b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1402daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1403daf98e941e140e8739458126640183b9f296a2abChet Haase}
1404daf98e941e140e8739458126640183b9f296a2abChet Haase
14052b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14086554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1409cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1410daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1411daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
14126554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1413daf98e941e140e8739458126640183b9f296a2abChet Haase}
1414daf98e941e140e8739458126640183b9f296a2abChet Haase
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
142204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
142333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
142433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
142504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
142633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
142733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
142833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
143327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
143433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1444b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
14454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
14485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
14495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
14505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
14515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
14525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
14535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
14545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
14555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
145733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
145833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
145933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
146033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
14624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1471b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1476807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1477807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1478807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1479807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1480807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1481807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1489b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1496b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15026554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
15031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1504cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1505cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1506b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1507b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
15080fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
150933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
15106554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
15110fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
15120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1513486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
15146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1515ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1516ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1518486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15206c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1521486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
152733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1528486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1531486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
153333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
153433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
153533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
153633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
154133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1542486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1545486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
15475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
154833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
154933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
15504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
15524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
155433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1555486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1558486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1559486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
156095c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
1561e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1562e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1563e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1564e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1565e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1566486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1567e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1568e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1569486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
15705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
15715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
15725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
15735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
15745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
15755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
15765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
15775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
15785a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15795a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15815a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15825a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1583486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1586486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1587486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1588486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
1589be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int alpha;
1590be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SkXfermode::Mode mode;
1591be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
1592be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
159333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
159433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1600be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(alpha);
1601be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(mode);
160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1603486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1606486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1607b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
16084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1610486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1613486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
16145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
161633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
161733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
16184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
16194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
162033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1621486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1624486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
162633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
162733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
162833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
162901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
163001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
163101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
163233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1633486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
163401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
163501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1636486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
163701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
163801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
163901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
164001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1641486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
164201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
164301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1644486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1645c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1646c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1647c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1648c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1649486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1650c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1651c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1652486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
16538b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
165482d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
16558b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
16568b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
16578b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
16588b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1659486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16608b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
16618b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1662486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
166333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
166433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
166533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
166633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
166795c21d0546e36ade3e0601394f5b625541836545Romain Guy    left -= offset;
166895c21d0546e36ade3e0601394f5b625541836545Romain Guy    top -= offset;
166995c21d0546e36ade3e0601394f5b625541836545Romain Guy
167095c21d0546e36ade3e0601394f5b625541836545Romain Guy    const bool reject = quickReject(left, top, left + width, top + height);
167133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
16724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
16734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
167433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1675486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1678486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1679b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
16804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
16814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1682486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1683ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1684ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1685486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1686ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1687ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1688ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1689486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1692996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1693996e57c84368058be793897ebc355b917a59abc2Raph Levien        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1694996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1695996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawTextOnPath);
1696996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1697996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1698996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPath(path);
1699996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(hOffset);
1700996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(vOffset);
1701996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1702996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPaint(paint);
1703996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1704996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1705996e57c84368058be793897ebc355b917a59abc2Raph Levien
1706996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1707996e57c84368058be793897ebc355b917a59abc2Raph Levien        const float* positions, SkPaint* paint) {
1708996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1709996e57c84368058be793897ebc355b917a59abc2Raph Levien    addOp(DisplayList::DrawPosText);
1710996e57c84368058be793897ebc355b917a59abc2Raph Levien    addText(text, bytesCount);
1711996e57c84368058be793897ebc355b917a59abc2Raph Levien    addInt(count);
1712996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
1713996e57c84368058be793897ebc355b917a59abc2Raph Levien    paint->setAntiAlias(true);
1714996e57c84368058be793897ebc355b917a59abc2Raph Levien    addPaint(paint);
1715996e57c84368058be793897ebc355b917a59abc2Raph Levien    return DrawGlInfo::kStatusDone;
1716996e57c84368058be793897ebc355b917a59abc2Raph Levien}
1717996e57c84368058be793897ebc355b917a59abc2Raph Levien
1718c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1719996e57c84368058be793897ebc355b917a59abc2Raph Levien        float x, float y, const float* positions, SkPaint* paint, float length) {
1720486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
172133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
17228f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
17238f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
17248f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
17258f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
17268f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
17278f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1728c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
17298f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
173033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
173133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
173233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
173333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
173433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
173533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
173633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
173733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
173833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
1739c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
174033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
174133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
1742996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(x);
1743996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloat(y);
1744996e57c84368058be793897ebc355b917a59abc2Raph Levien    addFloats(positions, count * 2);
17454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
174633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
174733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1748486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1749eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1750eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
17514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1752b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
17534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
17565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
17575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
17584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1761b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
17624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1765ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1766ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
17674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1770b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
17714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1774b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
17754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
17764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
17774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
17784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
17815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
17825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
17855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
17865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
17875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
17885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
17914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1792