DisplayListRenderer.cpp revision be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbee
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();
489be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
490be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
4915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
492a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
5185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
520a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
5275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5285baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
529a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
539a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
552a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
554ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
555ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
556ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
563ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5725baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
577325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
581cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
583a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
586325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
587325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
588325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
589325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
590325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
591325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
594325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
595325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
596325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
597eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
598eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
599eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
600eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
601eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
6025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
603eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
604a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
605eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
606ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
6075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
608ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
609ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
610ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
611ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
6125baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
613ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
614ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
615ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
6165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
619ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
620ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
6215baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
622ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
623ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
624ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
6255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
626ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
627ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
628ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
629ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
630ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
631ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
632ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
636ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
651ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
652ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
7001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAnimationMatrix) {
7141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7269420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
7339d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // TODO: should be able to store the size of a DL at record time and not
7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // have to pass it into this call. In fact, this information might be in the
7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        // location/size info that we store with the new native transform data.
7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
740a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            flags |= SkCanvas::kClipToLayer_SaveFlag;
742a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mMultipliedAlpha, flags);
7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
750a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
751a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
752ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
754a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
755a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
756a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    updateMatrix();
7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mLeft != 0 || mTop != 0) {
7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop);
7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.translate(mLeft, mTop);
7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mStaticMatrix) {
7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (static)", mStaticMatrix,
7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(0), mStaticMatrix->get(1),
7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(2), mStaticMatrix->get(3),
7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(4), mStaticMatrix->get(5),
7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(6), mStaticMatrix->get(7),
7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mStaticMatrix->get(8));
7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mStaticMatrix);
7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    } else if (mAnimationMatrix) {
7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD(
7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7801271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                indent, "ConcatMatrix (animation)", mAnimationMatrix,
7811271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(0), mAnimationMatrix->get(1),
7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(2), mAnimationMatrix->get(3),
7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(4), mAnimationMatrix->get(5),
7841271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(6), mAnimationMatrix->get(7),
7851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                mAnimationMatrix->get(8));
7861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.concatMatrix(mAnimationMatrix);
7871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
7881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mMatrixFlags != 0) {
7891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (mMatrixFlags == TRANSLATION) {
7901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.translate(mTranslationX, mTranslationY);
7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
7939420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            DISPLAY_LIST_LOGD(
7949420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase                    "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    indent, "ConcatMatrix", mTransformMatrix,
7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(0), mTransformMatrix->get(1),
7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(2), mTransformMatrix->get(3),
7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(4), mTransformMatrix->get(5),
7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(6), mTransformMatrix->get(7),
8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mTransformMatrix->get(8));
8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.concatMatrix(mTransformMatrix);
802a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mAlpha < 1 && !mCaching) {
8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        if (!mHasOverlappingRendering) {
8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha);
8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.setAlpha(mAlpha);
8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        } else {
8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // TODO: should be able to store the size of a DL at record time and not
8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // have to pass it into this call. In fact, this information might be in the
8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            // location/size info that we store with the new native transform data.
8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            if (mClipChildren) {
8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
8159d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                    mMultipliedAlpha, flags);
8219d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
8231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (mClipChildren) {
8241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                (float) mRight - mLeft, (float) mBottom - mTop);
8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                SkRegion::kIntersect_Op);
828a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
829a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
830a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
831ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
832ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
833ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
834ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
835ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
837486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t drawGlStatus = DrawGlInfo::kStatusDone;
838b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
839b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
840b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
841ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
842ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
843ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
844ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
845ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
846ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
847ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
848a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    Rect* clipRect = renderer.getClipRect();
849a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase    DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f",
850a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top,
851a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase            clipRect->right, clipRect->bottom);
852ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
853b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
85413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
8551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
8561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save",
8571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo);
8581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    setViewProperties(renderer, level);
8591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    if (renderer.quickReject(0, 0, mWidth, mHeight)) {
860b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
861b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
862b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
863486590963e2207d68eebd6944fec70d50d41116aChet Haase        return drawGlStatus;
864b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
86513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8669c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
867ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
87033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
871390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
87233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
87333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
87433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
87533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
87633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
87733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
87833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
87933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
88033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
882ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
884daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
885daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
886daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
88713631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8886554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
88913631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
890daf98e941e140e8739458126640183b9f296a2abChet Haase            }
891daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
892b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
89333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
894daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
895daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
896b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
897b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
898b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
899daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
902b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
903b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
90433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
905daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
906daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
908b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
910daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
911daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
912daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
913daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
9145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
91533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
916daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
917a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
918daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
920b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9215b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
922daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
923daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
924daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
925daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
92633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
92733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
928daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
929a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
930daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
9315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
9325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
934daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
935daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
936daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
937daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
941daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
942daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
943daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
946b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
947daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
948daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
949daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
950daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
952b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
953807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
954daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
955daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
956daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
957daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
958807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
959807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
960b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
961daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
962daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
963daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
964b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
965b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
966b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
967daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
968a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
969a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
970a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
971a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
972a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
973a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
974daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
975b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
977b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
978daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
979daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
980daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
981daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
98233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
983daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
984a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
985daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
986b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
987b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
989daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
99033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
99133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
9921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                        displayList, mWidth, mHeight, flags, level + 1);
9931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase                drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1);
9940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
997daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
998daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
999daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10016f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1002a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1003a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
1004daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1005a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
1006486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
10076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
10086c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
1009b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
1010daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1011daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1012daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
10135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10146f9ad204cc529babeb3aa7c9a57cf00ed7188471Chet Haase                if (mCaching) {
1015b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
1016b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
1017daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1018a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
1019486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1020b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1021b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1022b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
1023daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1024daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
10255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1026daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
1027a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
1028486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1031b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
1032daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
1033daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1034daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1035daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1036daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1037daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1038daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
1039daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
1040daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
10415ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1042daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1043a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
1044a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
1045486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
1046b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1048e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            case DrawBitmapData: {
1049e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkBitmap* bitmap = getBitmapData();
1050e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float x = getFloat();
1051e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                float y = getFloat();
1052e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                SkPaint* paint = getPaint(renderer);
1053e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1054e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy                        bitmap, x, y, paint);
1055486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
1056e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            }
1057e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy            break;
10585a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
105933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
10605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
10615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
10625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
10635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
10645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
10655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
10665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
106733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1070daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1071486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
1072486590963e2207d68eebd6944fec70d50d41116aChet Haase                        colors, paint);
10735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1074a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1077b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10784bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1079b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1080b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10814bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1082b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1083b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1084b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1085b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1086b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10874bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1088b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10899ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10909ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10919ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10929ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
1093be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
1094be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                int alpha = getInt();
1095be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                SkXfermode::Mode mode = (SkXfermode::Mode) getInt();
10969ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1097daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1098486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
1099be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        xDivsCount, yDivsCount, numColors, left, top, right, bottom,
1100be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy                        alpha, mode);
1101b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
110433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
110533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1106daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1107486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1111daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1112daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1113daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1114daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1116daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1118486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
112101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1122daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1125daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1126daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1127daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
11285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1129daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1131486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
113201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
113301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
113401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1135daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1136daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1137daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
11385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1139daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1140a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1141486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
114201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
114301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1144c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1145daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1146daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1147daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1148daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
11495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1150daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1151a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1152486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
1153c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1154c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
11558b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1156daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1158daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1159daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1160daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1161daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
116233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
11635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1164daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1165a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1166486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
11678b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
11688b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1170daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
11715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1172daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1173486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPath(path, paint);
1174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
117733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1180daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1181486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawLines(points, count, paint);
1182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1184ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
118533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1186ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1188ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1189486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPoints(points, count, paint);
1190ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1191ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
119433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1195daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1196daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1198cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1199cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1200cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1201486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawText(text.text(), text.length(), count, x, y,
1202486590963e2207d68eebd6944fec70d50d41116aChet Haase                        paint, length);
1203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1205325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1206325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1207325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1208325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1209325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1210325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1211325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1212325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1213325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1214486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
1215325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1216325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1217325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1218eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1219eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
122033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
122133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1222eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
12235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1224eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1225eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1226486590963e2207d68eebd6944fec70d50d41116aChet Haase                drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
1227486590963e2207d68eebd6944fec70d50d41116aChet Haase                        positions, paint);
1228eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1229eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1231daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1236daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1237daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1238daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1242daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1247daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1248daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1249daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1253daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1258daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1259daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1260daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
126133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1262daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1264daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1265daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1266daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
12675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
12685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
12695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
12705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
12725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
127333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
127433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1280daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1281daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1283daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1286ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
12871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
12881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    renderer.restoreToCount(restoreTo);
128913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
129013631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12926554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12936554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
130133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
13024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
13054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
13064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
13094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
13105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
13115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
13125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1313d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
13145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
13155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1316d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
131749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) {
131849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i);
131949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        caches.resourceCache.decrementRefcount(bitmap);
132049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
132149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    mOwnedBitmapResources.clear();
132249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1323d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1324d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1325d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1326d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1327d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
132843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1329d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
133043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
133124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
133224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
133343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
1334d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    for (size_t i = 0; i < mSourcePaths.size(); i++) {
1335d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        caches.resourceCache.decrementRefcount(mSourcePaths.itemAt(i));
1336d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    }
1337d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase    mSourcePaths.clear();
1338d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase
133943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
134043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1341d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
13422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
13432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1344d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1345d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
134604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
134704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1354162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1355162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1356162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
13575977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1358162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
13595977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
136004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1361162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
13625977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
13635977baa1fa24125c148a72699b53e62abaf08960Chet Haase
136449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() {
136549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    return true;
136649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy}
136749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
1368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1370b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1371b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1373b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1374b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
137544b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haaseint DisplayListRenderer::prepareDirty(float left, float top,
13767d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1379b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1380b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
138127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
138244b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
138327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
138427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
138527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
138627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
138733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1388b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1390daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1391daf98e941e140e8739458126640183b9f296a2abChet Haase}
1392daf98e941e140e8739458126640183b9f296a2abChet Haase
13932b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13966554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1397cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1398daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1399daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
14006554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1401daf98e941e140e8739458126640183b9f296a2abChet Haase}
1402daf98e941e140e8739458126640183b9f296a2abChet Haase
14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
141004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
141133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
141233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
141304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
141433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
141533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
141633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
142127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
142233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
14234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
14244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
14275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
14314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
14334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14355b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
14365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
14375b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
14385b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
14395b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
14405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
14415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
14425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
14435b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
14444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
144533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
144633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
144733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
144833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
14494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
14504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
14554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1459b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
14604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
14624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1464807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1465807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1466807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1467807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1468807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1469807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1471b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14906554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
14911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        Rect& dirty, int32_t flags, uint32_t level) {
1492cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1493cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1494b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1495b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
149733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14986554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14990fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
15000fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1501486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
15026c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1503ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1504ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
15056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
1506486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
15086c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1509486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
151133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
15144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
151533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1516486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1519486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
152033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
152133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
152433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
152533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
152933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1530486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1533486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
15344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
15355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
153633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
15414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
154233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1543486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1546486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
1547486590963e2207d68eebd6944fec70d50d41116aChet Haase        SkPaint* paint) {
1548e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), bitmap->height());
1549e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
1550e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addBitmapData(bitmap);
1551e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPoint(left, top);
1552e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addPaint(paint);
1553e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy    addSkip(location);
1554486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1555e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy}
1556e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy
1557486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
15585a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
15595a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
15605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
15615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
15625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
15635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
15645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
15655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
15665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
15675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
15685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
15695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
15705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
1571486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
15735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1574486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
1575486590963e2207d68eebd6944fec70d50d41116aChet Haase        const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
1576486590963e2207d68eebd6944fec70d50d41116aChet Haase        int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
1577be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    int alpha;
1578be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SkXfermode::Mode mode;
1579be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
1580be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
158133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
158233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
15834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
15844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
15854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
15864bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
1588be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(alpha);
1589be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    addInt(mode);
159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1591486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1594486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1595b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
15974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
1598486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
15994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1601486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
16025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
160333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
16064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
16074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1609486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1612486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1613a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
161533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
161633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
161701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
161801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
161901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
162033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1621486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
162201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
162301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1624486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
162501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
162601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
162701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
162801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
1629486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
163001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
163101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1632486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1633c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1634c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1635c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1636c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1637486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1638c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1639c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
1640486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
16418b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
164282d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
16438b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
16448b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
16458b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
16468b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
1647486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16488b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
16498b2f5267f16c295f12faab810527cd6311997e34Romain Guy
1650486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
165133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
165233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
165333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
165433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
165533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
165633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
165933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1660486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1663486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1664b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1667486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1668ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1669ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1670486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1671ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1672ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1673ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
1674486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
16754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1677486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1678cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
1679486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
168033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
16818f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
16828f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
16838f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
16848f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
16858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
16868f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1687c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
16888f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
168933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
169033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
169133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
169233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
169333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
169433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
169533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
169633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
169733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
169833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
169933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
170033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
170133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
17024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
170333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
170433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
1705486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
17064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1708486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1709325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1710486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1711325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1712325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1713325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1714325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1715325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1716325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1717325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1718325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1719486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1720325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1721325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1722486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1723eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
1724486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (!text || count <= 0) return DrawGlInfo::kStatusDone;
1725eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1726eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1727eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1728eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1729eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1730eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1731486590963e2207d68eebd6944fec70d50d41116aChet Haase    return DrawGlInfo::kStatusDone;
1732eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1733eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
17344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1735b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
17364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
17395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
17405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
17414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1744b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
17454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1748ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1749ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
17504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1753b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
17544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1757b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
17584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
17594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
17604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
17614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
17624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
17635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
17645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
17655ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
17685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
17695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
17705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
17715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
17725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
17734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
17744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1775