DisplayListRenderer.cpp revision 486590963e2207d68eebd6944fec70d50d41116a
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h>
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
52e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    "DrawBitmapData",
535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
56ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
59c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
608b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
63ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
65325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
66eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
72daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
75daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
879c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
97491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL),
999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    mStaticMatrix(NULL), mAnimationMatrix(NULL) {
100491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1045977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
107d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
111b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mRight = 0;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
116db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    mHasOverlappingRendering = true;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
126b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mCameraDistance = 0;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
136a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
142bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
143bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
144d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix;
1481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformCamera;
1491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mTransformMatrix3D;
1501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mStaticMatrix;
1511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    delete mAnimationMatrix;
1521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix = NULL;
1531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformCamera = NULL;
1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mTransformMatrix3D = NULL;
1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mStaticMatrix = NULL;
1561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    mAnimationMatrix = NULL;
157a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase
16549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
16649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
16749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.decrementRefcount(bitmap);
16849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.destructor(bitmap);
16949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
17049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    mOwnedBitmapResources.clear();
17149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
172d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
173d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
175d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
176d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
179d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
18124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1825977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1835977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1845977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1855977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1865977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1891af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1901af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1911af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
195d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
196d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
197d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
198d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
199d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
2005977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
2015977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
2025977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
2035977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
2045977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
2055977baa1fa24125c148a72699b53e62abaf08960Chet Haase
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
214d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
215d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
216d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
217d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
219d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
22065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
22165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
22365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
22749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources();
2285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
233d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
23449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources();
23549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < ownedBitmapResources.size(); i++) {
23649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* resource = ownedBitmapResources.itemAt(i);
23749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        mOwnedBitmapResources.add(resource);
23849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.incrementRefcount(resource);
23949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
24049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
24149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources();
242d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
243d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
244d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
245d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
246d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
247d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
24849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkiaShader*>& shaders = recorder.getShaders();
24924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
250d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
251d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
252d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
25549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPaint*>& paints = recorder.getPaints();
256d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
257d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
258d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
259d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
26049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkPath*>& paths = recorder.getPaths();
2612fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
26549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths();
266d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < sourcePaths.size(); i++) {
267d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        mSourcePaths.add(sourcePaths.itemAt(i));
268d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.incrementRefcount(sourcePaths.itemAt(i));
269d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
270d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
27149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    const Vector<SkMatrix*>& matrices = recorder.getMatrices();
272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
27865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
27904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
28065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
28165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
28265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
28365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
299ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this,
300ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy            mName.string(), isRenderable());
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
3021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
31033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
31133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
31233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
31333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
3195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
3245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
390a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
4005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
401a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
40633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
40733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
4081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
418a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
435a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
450a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
453e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
454e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
455e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
456e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
457e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
458e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint);
459e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
460e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
485a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
486a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
487a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
488a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4895ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
491a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
519a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
528a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
538a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
551a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
555ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
558ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
565ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
576325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
580cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
582a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
585325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
586325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
587325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
588325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
589325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
590325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
591325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
594325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
595325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
596eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
597eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
598eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
599eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
600eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
6015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
602eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
603a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
604eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
605ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
607ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
608ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
609ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
610ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6115baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
612ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
613ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
619ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6205baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
621ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
622ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
623ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
625ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
626ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
627ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
628ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
629ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
630ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
631ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
634ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6365ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
646ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
649ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
651ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
6991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7259420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7329d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
739a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
741a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
749a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
750a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
751ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
753a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
754a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
755a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
756a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7929420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7939420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
801a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8149d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8209d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
827a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
828a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
829a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
830ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
831ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
832ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
833ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
834ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
836486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
837b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
838b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
839b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
840ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
841ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
842ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
843ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
844ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
845ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
846ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
847a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
848a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
849a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
850a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
851ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
852b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
85313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (renderer.quickReject(0, 0, mWidth, mHeight)) {
859b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
860b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
861b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
862486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
863b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
86413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8659c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
866ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
86933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
870390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
87133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
87233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
87333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
87433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
87533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
87633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
87733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
87833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
87933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
881ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
883daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
884daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
885daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
88613631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8876554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
88813631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
889daf98e941e140e8739458126640183b9f296a2abChet Haase            }
890daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
891b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
89233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
893daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
894daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
895b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
897b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
898daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
899b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
90333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
904daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
905daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
906b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
909daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
910daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
911daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
91433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
915daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
916a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
917daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
921daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
922daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
923daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
924daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
92533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
92633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
927daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
928a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
929daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
933daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
934daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
935daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
936daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
940daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
941daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
942daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
946daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
947daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
948daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
949daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
952807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
953daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
954daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
955daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
956daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
957807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
958807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
959b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
960daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
961daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
962daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
964b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
965b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
966daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
967a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
968a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
969a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
970a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
971a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
972a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
973daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
974b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
975b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
977daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
978daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
979daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
980daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
98133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
982daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
983a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
984daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
985b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
988daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
98933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
99033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
9911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
9921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
9930fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
996daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
997daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
998daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10006f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1001a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1003daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1004a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1005486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
10066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1008b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1009daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1010daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1011daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10136f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1014b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1015b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1016daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1017a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1018486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1019b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1020b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1021b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1022daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1023daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1025daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1026a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1027486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1028b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1031daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1032daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1033daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1034daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1035daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1036daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1037daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1038daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1039daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1041daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1042a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1043a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1044486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1045b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1047e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1048e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1049e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1050e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1051e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1052e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1053e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1054486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1055e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1056e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
10575a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
105833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10595a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
106633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1069daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1070486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1071486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
10725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1073a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1074b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1078b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1079b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1081b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1082b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1083b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1084b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1085b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10864bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1087b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10889ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10899ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10909ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10919ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10939ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1094daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1095486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1096486590963e2207d68eebd6944fec70d50d41116aChet Haase                        xDivsCount, yDivsCount, numColors, left, top, right, bottom, paint);
1097b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1098b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1099b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
110033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
110133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1102daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1103486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1105b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1107daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1108daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1109daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1110daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1112daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1114486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
111701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1118daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1119daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1120daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1121daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1125daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1127486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
112801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
112901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
113001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1131daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1132daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1133daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11345ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1135daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1136a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1137486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
113801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
113901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1140c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1141daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1142daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1143daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1144daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1146daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1147a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1148486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1149c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1150c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11518b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1152daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1153daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1154daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1155daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1156daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
115833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1162486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11638b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11648b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1166daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1168daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1169486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
117333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1176daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1177486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1180ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
118133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1182ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1184ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1185486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1186ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1187ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
119033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1191daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1192daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1194cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1195cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1196cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1197486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawText(text.text(), text.length(), count, x, y,
1198486590963e2207d68eebd6944fec70d50d41116aChet Haase                        paint, length);
1199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1201325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1202325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1203325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1204325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1205325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1206325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1207325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1208325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1209325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1210486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1211325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1212325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1213325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1214eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1215eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
121633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
121733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1218eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1220eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1221eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1222486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1223486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1224eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1225eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1227daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1232daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1233daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1234daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1238daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1243daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1244daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1245daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1249daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1254daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1255daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1256daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
125733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1258daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1260daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1261daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1262daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
126933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
127033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1276daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1277daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1279daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1282ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
12831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
12841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
128513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
128613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12886554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12896554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
129733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
13075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
13085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1309d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
13105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
13115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1312d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
131349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
131449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
131549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.decrementRefcount(bitmap);
131649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
131749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    mOwnedBitmapResources.clear();
131849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1319d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1320d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1321d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1322d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1323d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
132443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1325d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
132643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
132724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
132824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
132943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1330d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
1331d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
1332d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
1333d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1334d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
133543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
133643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1337d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
13382fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
13392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1340d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1341d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
134204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
134304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1350162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1351162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1352162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13535977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1354162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13555977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
135604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1357162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13585977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13595977baa1fa24125c148a72699b53e62abaf08960Chet Haase
136049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
136149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
136249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
136349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1364b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1370b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
13717d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
13727d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1375b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1376b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
137727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
137827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
137927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
138027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
138127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
138233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1385daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1386daf98e941e140e8739458126640183b9f296a2abChet Haase}
1387daf98e941e140e8739458126640183b9f296a2abChet Haase
13882b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13916554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1392cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1393daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1394daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
13956554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1396daf98e941e140e8739458126640183b9f296a2abChet Haase}
1397daf98e941e140e8739458126640183b9f296a2abChet Haase
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
140504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
140633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
140733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
140804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
140933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
141033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
141133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
141627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
141733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1423b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
14315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
14325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
14335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
14345b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
14355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
14365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
14375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
14385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
14394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
144033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
144133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
144233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
144333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
14444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
14454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1459807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1460807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1461807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1462807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1463807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1464807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1472b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14856554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
14861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1487cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1488cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1489b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1490b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14910fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
149233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14936554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1496486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14976c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1498ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1499ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1501486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1504486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
150533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
150633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1511486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1514486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
151533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
151633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
151733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
151833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
151933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
152033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
152433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1525486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1528486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
15305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
153133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
15334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
15354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
15364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1538486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1541486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1542486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
1543e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), bitmap->height());
1544e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1545e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1546e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1547e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1548e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1549486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1550e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1551e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1552486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
15535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
15545a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
15555a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
15565a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
15575a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
15585a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
15595a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
15605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
15615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1566486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1569486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1570486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1571486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
157233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
157333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
158033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1581486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1584486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1585b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1588486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1591486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
15925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
159333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
159433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
159533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
15974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
159833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1599486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1602486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1603a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
160701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
160801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
160901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1611486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
161201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
161301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1614486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
161501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
161601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
161701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
161801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1619486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
162001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
162101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1622486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1623c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1624c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1625c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1626c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1627486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1628c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1629c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1630486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
16318b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
163282d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
16338b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
16348b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
16358b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
16368b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1637486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16388b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
16398b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1640486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
164133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
164233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
164333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
164433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
164533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
164633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
16474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
164933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1650486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1653486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1654b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
16554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
16564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1657486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1658ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1659ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1660486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1661ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1662ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1663ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1664486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1667486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1668cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
1669486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
167033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
16718f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
16728f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
16738f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
16748f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
16758f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
16768f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1677c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
16788f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
167933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
168033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
168133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
168233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
168333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
168433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
168533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
168633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
168733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
168833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
168933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
169033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
169133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
16924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
169333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
169433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1695486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1698486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1699325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1700486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1701325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1702325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1703325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1704325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1705325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1706325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1707325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1708325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1709486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1710325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1711325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1712486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1713eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
1714486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1715eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1716eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1717eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1718eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1719eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1720eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1721486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1722eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1723eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
17244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1725b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
17264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
17295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
17305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
17314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
17354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1738ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1739ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
17404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1743b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
17444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1747b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
17484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
17494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
17504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
17514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
17545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
17555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
17585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
17595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
17605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
17615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
17644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1765