DisplayListRenderer.cpp revision 1271e2cc80b01d577e9db339459ef0222bb9320d
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h>
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
525a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
58c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
62ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
71daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
74daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
75ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
96491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mStaticMatrix(NULL), mAnimationMatrix(NULL) {
99491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1035977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
104d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
110b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mRight = 0;
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
115db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    mHasOverlappingRendering = true;
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
125b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mCameraDistance = 0;
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
142bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
143d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix;
1471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformCamera;
1481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix3D;
1491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mStaticMatrix;
1501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mAnimationMatrix;
1511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1575977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
164d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
16924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1725977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1802fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1811af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1821af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1831af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase
193d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
201d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
203d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
204d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
20765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
220d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
221d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
222d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
223d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
22824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
22924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
231d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
232d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
235d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
245d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
246d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
247d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
25265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
25304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
25465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
25565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
25665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
25765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
260ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
27313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
2751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
28333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
28433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
28533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
28633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
37933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
3811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
400a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
408a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
423a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
450a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
451a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
452a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
453a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
456a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
472a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
484a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
493a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
503a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
518ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
541325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
545cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
547a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
550325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
551325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
552325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
553325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
561eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
562eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
563eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
564eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
567eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
568a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
569eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
5975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
598a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
611ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
613a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
615ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
617a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
618a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
619a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
6641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
6651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
6661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
6671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
6691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
6711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
6721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
6731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
6741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
6751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
6761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
6781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
6801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
6811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
6821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
6831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
6841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
6851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
6871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
6881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
6891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
6909420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
6911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
6921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
6931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
6941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
6951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
6961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
6979d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
6981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
6991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
716ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7171271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7589420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
7799d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
7859d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
792a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
793a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
794a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
795ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
796ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
797ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
798ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
799ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
8016554943a1dd6854c0f4976900956e556767b49e1Romain Guy    status_t drawGlStatus = 0;
802b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
803b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
804b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
805ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
806ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
807ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
808ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
809ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
810ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
811ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
812a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
813a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
814a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
815a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
816ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
81813631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (renderer.quickReject(0, 0, mWidth, mHeight)) {
824b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
825b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
826b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
827b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        return false;
828b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
82913631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8309c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
831ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
832b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
83433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
835390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
83633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
83733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
83833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
83933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
84033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
84133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
84233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
84433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8459c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
846ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
848daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
849daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
850daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
85113631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8526554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
85313631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
854daf98e941e140e8739458126640183b9f296a2abChet Haase            }
855daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
856b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
85733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
858daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
859daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
860b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
861b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
862b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
863daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
864b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
866b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
86833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
869daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
870daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
871b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
872b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
873b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
874daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
875daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
876daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
877daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
87933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
880daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
881a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
882daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
886daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
887daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
888daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
889daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
89033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
89133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
892daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
893a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
894daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
8955b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
8965b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
897b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
898daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
899daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
900daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
901daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
903b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
904b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
905daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
906daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
907daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
911daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
913daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
914daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
915b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
916b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
917807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
918daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
919daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
920daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
921daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
922807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
923807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
924b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
925daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
926daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
927daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
928b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
929b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
930b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
931daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
932a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
933a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
934a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
935a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
936a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
937a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
938daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
941b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
942daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
943daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
944daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
945daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
94633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
947daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
948a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
949daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
953daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
95433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
95533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
9561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
9571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
9580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
961daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
962daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
963daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
965a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
966a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
967a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
968daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
969a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
970daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
973b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
974daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
975daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
976daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
978b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
979b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
980b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
981daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
982a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
983daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
984b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
985b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
987daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
988daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
9895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
990daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
991a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
992daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
993b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
994b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
995b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
996daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
997daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
998daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
999daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1000daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1001daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1002daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1004daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1006daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1007a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1008a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1009daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1010b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1011b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
10125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
101333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10145a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10175a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
102133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1024daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10259ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1027a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1028b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10314bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1032b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1033b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1035b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1036b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1037b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1038b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1039b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1041b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10429ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10439ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10449ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10459ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10479ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1048daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10509ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1051b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1052b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1053b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
105433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
105533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1056daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1057daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1058b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1059b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1060b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1061daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1062daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1063daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1064daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1066daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1067a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1068daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1069b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1070b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
107101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1072daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1073daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1074daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1075daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1076daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1077daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1079daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1080a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1081daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
108201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
108301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
108401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1085daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1086daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1087daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
10885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1089daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1090a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1091daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
109201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
109301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1094c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1095daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1096daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1097daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1098daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1101a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1103c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1104c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11058b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1106daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1107daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1108daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1109daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1110daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1111daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
111233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1114daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1116daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11178b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11188b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1120daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
112733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1130daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11319ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1134ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
113533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1136ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1138ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11399ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1140ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1141ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
114433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1146daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1148cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1149cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1150cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1151cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1154325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1155325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1156325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1157325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1158325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1159325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1160325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1161325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1162325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1163325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1164325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1165325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1166325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1167eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1168eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
116933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
117033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1171eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1173eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1174eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1175eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1176eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1177eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1184daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1185daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1186daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1195daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1196daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1197daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1201daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1206daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1207daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1208daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
120933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1210daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1212daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1213daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1214daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
122133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
122233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1228daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1229daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1231daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1234ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
12351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
12361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
123713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
123813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12406554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12416554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
124933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1261d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1264d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1265d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1266d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1267d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1268d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1269d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
127043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1271d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
127243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
127324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
127424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
127543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
127643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
127743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1278d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12792fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12802fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1281d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1282d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
128304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
128404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
12854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
12894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1291162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1292162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1293162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
12945977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1295162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
12965977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
129704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1298162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
12995977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13005977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13087d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13097d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
131427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
131527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
131627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
131727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
131827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
131933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1322daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1323daf98e941e140e8739458126640183b9f296a2abChet Haase}
1324daf98e941e140e8739458126640183b9f296a2abChet Haase
13252b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13286554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1329cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1330daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1331daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
13326554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1333daf98e941e140e8739458126640183b9f296a2abChet Haase}
1334daf98e941e140e8739458126640183b9f296a2abChet Haase
13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
134204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
134333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
134433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
134504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
134633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
134733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
134833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
135327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
135433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
137733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
137833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
137933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
138033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
13864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
13874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
13884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1391b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
13934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
13944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1396807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1397807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1398807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1399807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1400807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1401807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1403b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14226554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
14231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1424cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1425cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1426b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1427b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
142933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14306554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1433ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14346c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1435ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1436ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14376c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14396c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
144033f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
144133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
144233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
144633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
144933f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
145033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
145133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
145233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
145333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
145433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
145533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
145933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
146533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
146633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
147133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14785a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14795a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14815a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
14825a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
14835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
14845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
14855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
14865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
14875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
14885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
14895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
14914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
14925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
149333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
149433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
14954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
14984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
150133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1505b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
151233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
151333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
151433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
152001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1521a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
152433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
152501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
152601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
152701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
152833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
152901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
153001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
153101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
153201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
153301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
153401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
153501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
153601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
153701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1538c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1539c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1540c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1541c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1542c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1543c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1544c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15458b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15468b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
154782d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15488b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15498b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15508b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15518b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15528b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15538b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
155533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
155633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
155733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
155833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
155933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
156033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
156333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15665c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1567b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1570ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1571ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1572ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1573ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1574ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1575ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1579cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
158033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
158133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
15828f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
15838f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
15848f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
15858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
15868f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
15878f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1588c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
15898f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
159133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
159233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
159333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
159433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
159533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
159633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
159733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
159833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
159933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
160033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
160133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
16064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1608325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1609325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1610325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1611325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1612325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1613325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1614325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1615325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1616325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1617325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1618325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1619325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1620325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1621eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1622eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
162333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1624eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1625eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1626eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1627eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1628eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1629eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1630eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1631eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1642b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1646ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1647ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1651b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1655b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1673