DisplayListRenderer.cpp revision b85967b9af76e1e60f7a96603e2567a6449d2e04
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer"
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h>
209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h>
226554943a1dd6854c0f4976900956e556767b49e1Romain Guy
239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h"
259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h"
2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = {
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Save",
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Restore",
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "RestoreToCount",
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayer",
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SaveLayerAlpha",
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Translate",
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Rotate",
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "Scale",
434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy    "Skew",
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetMatrix",
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ConcatMatrix",
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ClipRect",
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawDisplayList",
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLayer",
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmap",
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapMatrix",
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawBitmapRect",
525a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    "DrawBitmapMesh",
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPatch",
54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawColor",
55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawRect",
5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawRoundRect",
5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    "DrawCircle",
58c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    "DrawOval",
598b2f5267f16c295f12faab810527cd6311997e34Romain Guy    "DrawArc",
60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawPath",
61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawLines",
62ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    "DrawPoints",
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "DrawText",
64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    "DrawTextOnPath",
65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    "DrawPosText",
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShader",
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupShader",
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetColorFilter",
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "SetupColorFilter",
70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    "ResetShadow",
71daf98e941e140e8739458126640183b9f296a2abChet Haase    "SetupShadow",
725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "ResetPaintFilter",
735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    "SetupPaintFilter",
74daf98e941e140e8739458126640183b9f296a2abChet Haase    "DrawGLFunction"
75ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy};
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) {
789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    if (logBuffer.isEmpty()) {
809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        return;
819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    }
8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    FILE *file = fdopen(fd, "a");
8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fprintf(file, "\nRecent DisplayList operations\n");
869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    logBuffer.outputCommands(file, OP_NAMES);
8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    String8 cachesLog;
8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    Caches::getInstance().dumpMemoryUsage(cachesLog);
9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\nCaches:\n%s", cachesLog.string());
9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    fprintf(file, "\n");
9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    fflush(file);
949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase}
959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
96491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) :
97491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase    mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL) {
98491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase
995977baa1fa24125c148a72699b53e62abaf08960Chet Haase    initFromDisplayListRenderer(recorder);
1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1025977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() {
103d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    clearResources();
104d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase}
105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
106a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() {
107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mLeft = 0;
108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTop = 0;
109b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mRight = 0;
110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mBottom = 0;
111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mApplicationScale = -1;
112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mClipChildren = true;
113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mAlpha = 1;
114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMultipliedAlpha = 255;
115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationX = 0;
116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mTranslationY = 0;
117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotation = 0;
118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationX = 0;
119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mRotationY= 0;
120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleX = 1;
121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mScaleY = 1;
122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotX = 0;
123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotY = 0;
124b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    mCameraDistance = 0;
125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixDirty = false;
126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mMatrixFlags = 0;
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevWidth = -1;
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPrevHeight = -1;
129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mWidth = 0;
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mHeight = 0;
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mPivotExplicitlySet = false;
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    mCaching = false;
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    if (displayList) {
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        DISPLAY_LIST_LOGD("Deferring display list destruction");
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy        Caches::getInstance().deleteDisplayListDeferred(displayList);
139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    }
140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy}
141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
142d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() {
1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase    sk_free((void*) mReader.base());
1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase
145866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
146866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformMatrix) {
147866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformMatrix;
148866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformMatrix = NULL;
149866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
150866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformCamera) {
151866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformCamera;
152866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformCamera = NULL;
153866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
154866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        if (mTransformMatrix3D) {
155866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            delete mTransformMatrix3D;
156866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase            mTransformMatrix3D = NULL;
157866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase        }
158a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
159a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase    Caches& caches = Caches::getInstance();
1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mBitmapResources.clear();
1665977baa1fa24125c148a72699b53e62abaf08960Chet Haase
167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
169d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
170d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
171d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
17224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
17343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.destructor(mShaders.itemAt(i));
1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
17624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mPaints.size(); i++) {
1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mPaints.itemAt(i);
1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1815977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mPaints.clear();
1825977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1832fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < mPaths.size(); i++) {
1841af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        SkPath* path = mPaths.itemAt(i);
1851af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        caches.pathCache.remove(path);
1861af23a32d879db330eb5a08b21090ec60b604a32Romain Guy        delete path;
1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
1882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
1892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase    for (size_t i = 0; i < mMatrices.size(); i++) {
1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase        delete mMatrices.itemAt(i);
1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase    mMatrices.clear();
1945977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
1955977baa1fa24125c148a72699b53e62abaf08960Chet Haase
196d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) {
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writer = recorder.writeStream();
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    init();
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    if (writer.size() == 0) {
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return;
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
204d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    if (reusing) {
205d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        // re-using display list - clear out previous allocations
206d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase        clearResources();
207d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    }
208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    initProperties();
209d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = writer.size();
21165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    void* buffer = sk_malloc_throw(mSize);
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    writer.flatten(buffer);
21365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mReader.setMemory(buffer, mSize);
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources();
2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < bitmapResources.size(); i++) {
2195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkBitmap* resource = bitmapResources.itemAt(i);
2205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(resource);
2215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(resource);
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
223d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources();
225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < filterResources.size(); i++) {
226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaColorFilter* resource = filterResources.itemAt(i);
227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mFilterResources.add(resource);
228d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
229d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
230d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
23124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*> &shaders = recorder.getShaders();
23224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    for (size_t i = 0; i < shaders.size(); i++) {
233d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        SkiaShader* resource = shaders.itemAt(i);
234d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        mShaders.add(resource);
235d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.incrementRefcount(resource);
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*> &paints = recorder.getPaints();
239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < paints.size(); i++) {
240d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mPaints.add(paints.itemAt(i));
241d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
242d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*> &paths = recorder.getPaths();
2442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    for (size_t i = 0; i < paths.size(); i++) {
2452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        mPaths.add(paths.itemAt(i));
2462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*> &matrices = recorder.getMatrices();
249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    for (size_t i = 0; i < matrices.size(); i++) {
250d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        mMatrices.add(matrices.itemAt(i));
251d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    }
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() {
25565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    mSize = 0;
25604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mIsRenderable = true;
25765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy}
25865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
25965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() {
26065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    return mSize;
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the
265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function.
266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) {
268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    TextContainer text;
269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    uint32_t count = (level + 1) * 2;
271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    char indent[count + 1];
272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    for (uint32_t i = 0; i < count; i++) {
273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        indent[i] = ' ';
274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    indent[count] = '\0';
27613631f3da855f200a151e7837ed9f6b079622b58Romain Guy    ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    int saveCount = renderer.getSaveCount() - 1;
279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    outputViewProperties(renderer, (char*) indent);
281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    mReader.rewind();
282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    while (!mReader.eof()) {
284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        int op = mReader.readInt();
28533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
28633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            int skip = mReader.readInt();
28733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            ALOGD("%sSkip %d", (char*) indent, skip);
28833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            op &= ~OP_MAY_BE_SKIPPED_MASK;
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        switch (op) {
292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawGLFunction: {
293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Functor *functor = (Functor *) getInt();
2945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Save: {
298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int rendererNum = getInt();
2995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Restore: {
3035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case RestoreToCount: {
307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int restoreCount = saveCount + getInt();
3085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayer: {
312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
3165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SaveLayerAlpha: {
323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int alpha = getInt();
328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int flags = getInt();
3295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Translate: {
334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
3365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Rotate: {
340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float rotation = getFloat();
3415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Scale: {
345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case Skew: {
351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sx = getFloat();
352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float sy = getFloat();
3535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetMatrix: {
357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
3585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ConcatMatrix: {
362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s new concat %p: [%f, %f, %f]   [%f, %f, %f]   [%f, %f, %f]",
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1),
365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5),
366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ClipRect: {
370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int regionOp = getInt();
3755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawDisplayList: {
380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                DisplayList* displayList = getDisplayList();
381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t width = getUInt();
382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t height = getUInt();
38333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
38433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                renderer.outputDisplayList(displayList, level + 1);
387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLayer: {
390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                Layer* layer = (Layer*) getInt();
391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
3935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
3945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
395a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmap: {
399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
4025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
404a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMatrix: {
408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkMatrix* matrix = getMatrix();
4105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4115baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
412a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapRect: {
416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f7 = getFloat();
424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f8 = getFloat();
4255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawBitmapMesh: {
431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int verticesCount = 0;
432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t colorsCount = 0;
433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshWidth = getInt();
435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t meshHeight = getInt();
436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* vertices = getFloats(verticesCount);
437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                bool hasColors = getInt();
438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int* colors = hasColors ? getInts(colorsCount) : NULL;
4395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPatch: {
444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* xDivs = NULL;
445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int32_t* yDivs = NULL;
446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t* colors = NULL;
447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t xDivsCount = 0;
448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                uint32_t yDivsCount = 0;
449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int8_t numColors = 0;
450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkBitmap* bitmap = getBitmap();
451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                xDivs = getInts(xDivsCount);
452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                yDivs = getInts(yDivsCount);
453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                colors = getUInts(numColors);
454a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float left = getFloat();
455a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float top = getFloat();
456a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float right = getFloat();
457a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                float bottom = getFloat();
4585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4595baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op],
460a62f172215727a1e00af0cb934904e00926a86c9Romain Guy                        left, top, right, bottom);
461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawColor: {
464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int xferMode = getInt();
4665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRect: {
470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
4745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
476a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawRoundRect: {
480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
4865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
488a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawCircle: {
492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
4955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
4965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %p",
497a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawOval: {
501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
5055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawArc: {
511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f1 = getFloat();
512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f2 = getFloat();
513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f3 = getFloat();
514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f4 = getFloat();
515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f5 = getFloat();
516ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float f6 = getFloat();
517ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int i1 = getInt();
5185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5195baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
520a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPath: {
524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkPath* path = getPath();
5255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawLines: {
530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawPoints: {
537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int count = 0;
538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float* points = getFloats(count);
5395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
5405baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case DrawText: {
544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                getText(&text);
545325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float x = getFloat();
547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float y = getFloat();
5485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
549cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
5505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op],
551a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, x, y, paint, length);
552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
561325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
562325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
563325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
564325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
566eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
567eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int count = getInt();
568eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                int positionsCount = 0;
569eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
5705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
571eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
572a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        text.text(), text.length(), count, paint);
573eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShader: {
5755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShader: {
579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaShader* shader = getShader();
5805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetColorFilter: {
5845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupColorFilter: {
588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
5895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
591ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case ResetShadow: {
5935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            case SetupShadow: {
597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float radius = getFloat();
598ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dx = getFloat();
599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                float dy = getFloat();
600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                int color = getInt();
6015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
602a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
603ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            }
604ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            break;
6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s", (char*) indent, OP_NAMES[op]);
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int clearBits = getInt();
6115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                int setBits = getInt();
6125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits);
6135ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
6145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
615ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase            default:
6165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block                ALOGD("Display List error: op not handled: %s%s",
617a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase                break;
619ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase        }
620ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    }
621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string());
622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() {
625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (mMatrixDirty) {
626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (!mTransformMatrix) {
627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix = new SkMatrix();
628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) {
630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformMatrix->reset();
631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mPivotExplicitlySet) {
633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mWidth != mPrevWidth || mHeight != mPrevHeight) {
634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevWidth = mWidth;
635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPrevHeight = mHeight;
636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotX = mPrevWidth / 2;
637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mPivotY = mPrevHeight / 2;
638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if ((mMatrixFlags & ROTATION_3D) == 0) {
641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->setTranslate(mTranslationX, mTranslationY);
642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY);
643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (!mTransformCamera) {
646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformCamera = new Sk3DView();
647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mTransformMatrix3D = new SkMatrix();
648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->reset();
650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->save();
651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY);
652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateX(mRotationX);
653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateY(mRotationY);
654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->rotateZ(-mRotation);
655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->getMatrix(mTransformMatrix3D);
656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY);
657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D->postTranslate(mPivotX + mTranslationX,
658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mPivotY + mTranslationY);
659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix->postConcat(*mTransformMatrix3D);
660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera->restore();
661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = false;
664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) {
668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
669a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
670a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
671a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
672a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
673a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
674a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
675a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
676a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
677a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
680a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
681a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
690b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        if (mAlpha < 1 && !mCaching) {
6919d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
6929d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // have to pass it into this call. In fact, this information might be in the
6939d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // location/size info that we store with the new native transform data.
6949d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
6959d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            if (mClipChildren) {
6969d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
6979d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
6989d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
6999d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7009d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    mMultipliedAlpha, flags);
7019d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
708ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t level) {
711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST
713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t count = (level + 1) * 2;
714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        char indent[count + 1];
715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        for (uint32_t i = 0; i < count; i++) {
716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            indent[i] = ' ';
717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        indent[count] = '\0';
719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif
720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        updateMatrix();
721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mLeft != 0 || mTop != 0) {
722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate", mLeft, mTop);
723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.translate(mLeft, mTop);
724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mApplicationScale >= 0) {
726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, "Scale",
727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    mApplicationScale, mApplicationScale);
728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.scale(mApplicationScale, mApplicationScale);
729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mMatrixFlags != 0) {
731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags == TRANSLATION) {
732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY);
733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.translate(mTranslationX, mTranslationY);
734a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
735a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
737a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        indent, "ConcatMatrix", mTransformMatrix,
738a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(0), mTransformMatrix->get(1),
739a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(2), mTransformMatrix->get(3),
740a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(4), mTransformMatrix->get(5),
741a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(6), mTransformMatrix->get(7),
742a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        mTransformMatrix->get(8));
743a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                renderer.concatMatrix(mTransformMatrix);
744a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
745a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
7469d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        if (mAlpha < 1 && !mCaching) {
7479d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // TODO: should be able to store the size of a DL at record time and not
7489d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // have to pass it into this call. In fact, this information might be in the
7499d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            // location/size info that we store with the new native transform data.
7509d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            int flags = SkCanvas::kHasAlphaLayer_SaveFlag;
7519d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            if (mClipChildren) {
7529d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                flags |= SkCanvas::kClipToLayer_SaveFlag;
7539d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            }
7549d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha",
7559d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop,
7569d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    mMultipliedAlpha, flags);
7579d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase            renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop,
7589d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase                    mMultipliedAlpha, flags);
7599d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase        }
760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (mClipChildren) {
761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f,
762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    (float) mRight - mLeft, (float) mBottom - mTop);
763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop,
764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    SkRegion::kIntersect_Op);
765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase}
768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
769ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/**
770ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked
771ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the
772ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view.
773ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */
7746554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayList::replay(OpenGLRenderer& renderer, uint32_t width,
775a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
7766554943a1dd6854c0f4976900956e556767b49e1Romain Guy    status_t drawGlStatus = 0;
777b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    TextContainer text;
778b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mReader.rewind();
779b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
780ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
781ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    uint32_t count = (level + 1) * 2;
782ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    char indent[count + 1];
783ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    for (uint32_t i = 0; i < count; i++) {
784ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        indent[i] = ' ';
785ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    }
786ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    indent[count] = '\0';
78713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string());
788ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
789b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
79013631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.startMark(mName.string());
791a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int restoreTo = 0;
792a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
793a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", indent, "Save",
794a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
795a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
796a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
797a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    setViewProperties(renderer, width, height, level);
798b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES && renderer.quickReject(0, 0, width, height)) {
799b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
800b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.restoreToCount(restoreTo);
801b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        renderer.endMark();
802b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase        return false;
803b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    }
80413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
8059c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
806ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    int saveCount = renderer.getSaveCount() - 1;
807b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    while (!mReader.eof()) {
8085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int op = mReader.readInt();
80933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (op & OP_MAY_BE_SKIPPED_MASK) {
810390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            int32_t skip = mReader.readInt();
81133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) {
81233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mReader.skip(skip);
81333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent,
81433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                        OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip);
81533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                continue;
81633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            } else {
81733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                op &= ~OP_MAY_BE_SKIPPED_MASK;
81833f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
81933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
8209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase        logBuffer.writeCommand(level, op);
821ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
8225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        switch (op) {
823daf98e941e140e8739458126640183b9f296a2abChet Haase            case DrawGLFunction: {
824daf98e941e140e8739458126640183b9f296a2abChet Haase                Functor *functor = (Functor *) getInt();
825daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor);
82613631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.startMark("GL functor");
8276554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.callDrawGLFunction(functor, dirty);
82813631f3da855f200a151e7837ed9f6b079622b58Romain Guy                renderer.endMark();
829daf98e941e140e8739458126640183b9f296a2abChet Haase            }
830daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
831b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Save: {
83233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t rendererNum = getInt();
833daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum);
834daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.save(rendererNum);
835b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
837b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Restore: {
838daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
839b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.restore();
840b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
841b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
842b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case RestoreToCount: {
84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t restoreCount = saveCount + getInt();
844daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount);
845daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.restoreToCount(restoreCount);
846b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
847b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
848b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SaveLayer: {
849daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
850daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
851daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
852daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
8535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
85433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
855daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent,
856a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, paint, flags);
857daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayer(f1, f2, f3, f4, paint, flags);
858b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
859b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
8605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            case SaveLayerAlpha: {
861daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
862daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
863daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
864daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
86533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t alpha = getInt();
86633f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
867daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent,
868a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        OP_NAMES[op], f1, f2, f3, f4, alpha, flags);
869daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags);
8705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            }
8715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            break;
872b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Translate: {
873daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
874daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
875daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2);
876daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.translate(f1, f2);
877b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
878b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
879b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Rotate: {
880daf98e941e140e8739458126640183b9f296a2abChet Haase                float rotation = getFloat();
881daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation);
882daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.rotate(rotation);
883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
884b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
885b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case Scale: {
886daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
887daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
888daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
889daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.scale(sx, sy);
890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
891b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
892807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            case Skew: {
893daf98e941e140e8739458126640183b9f296a2abChet Haase                float sx = getFloat();
894daf98e941e140e8739458126640183b9f296a2abChet Haase                float sy = getFloat();
895daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy);
896daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.skew(sx, sy);
897807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            }
898807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy            break;
899b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetMatrix: {
900daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
901daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix);
902daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setMatrix(matrix);
903b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
904b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
905b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ConcatMatrix: {
906daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
907a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                DISPLAY_LIST_LOGD(
908a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]",
909a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], matrix,
910a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(0), matrix->get(1), matrix->get(2),
911a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(3), matrix->get(4), matrix->get(5),
912a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        matrix->get(6), matrix->get(7), matrix->get(8));
913daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.concatMatrix(matrix);
914b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
915b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
916b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ClipRect: {
917daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
918daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
919daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
920daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
92133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t regionOp = getInt();
922daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op],
923a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, regionOp);
924daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp);
925b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
926b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9270fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            case DrawDisplayList: {
928daf98e941e140e8739458126640183b9f296a2abChet Haase                DisplayList* displayList = getDisplayList();
9297b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t width = getUInt();
9307b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy                uint32_t height = getUInt();
93133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t flags = getInt();
93233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op],
933a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        displayList, width, height, flags, level + 1);
9346554943a1dd6854c0f4976900956e556767b49e1Romain Guy                drawGlStatus |= renderer.drawDisplayList(displayList, width,
935a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        height, dirty, flags, level + 1);
9360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            }
9370fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            break;
9386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            case DrawLayer: {
939daf98e941e140e8739458126640183b9f296a2abChet Haase                Layer* layer = (Layer*) getInt();
940daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
941daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
943a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
944a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                    paint->setAlpha(mMultipliedAlpha);
945a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                }
946daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
947a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        layer, x, y, paint);
948daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawLayer(layer, x, y, paint);
9496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            }
9506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmap: {
952daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
953daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
954daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
9555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
956b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                if (mCaching && mMultipliedAlpha < 255) {
957b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                    paint->setAlpha(mMultipliedAlpha);
958b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase                }
959daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
960a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, x, y, paint);
961daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, x, y, paint);
962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
963b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
964b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapMatrix: {
965daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
966daf98e941e140e8739458126640183b9f296a2abChet Haase                SkMatrix* matrix = getMatrix();
9675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
968daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
969a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        bitmap, matrix, paint);
970daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, matrix, paint);
971b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
972b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
973b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawBitmapRect: {
974daf98e941e140e8739458126640183b9f296a2abChet Haase                SkBitmap* bitmap = getBitmap();
975daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
976daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
977daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
978daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
979daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
980daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
981daf98e941e140e8739458126640183b9f296a2abChet Haase                float f7 = getFloat();
982daf98e941e140e8739458126640183b9f296a2abChet Haase                float f8 = getFloat();
9835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
984daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
985a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], bitmap,
986a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, f5, f6, f7, f8,paint);
987daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
9905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            case DrawBitmapMesh: {
99133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t verticesCount = 0;
9925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t colorsCount = 0;
9935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
9945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                SkBitmap* bitmap = getBitmap();
9955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshWidth = getInt();
9965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                uint32_t meshHeight = getInt();
9975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                float* vertices = getFloats(verticesCount);
9985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy                bool hasColors = getInt();
99933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t* colors = hasColors ? getInts(colorsCount) : NULL;
10005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10015a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
1002daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10039ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
10045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            }
1005a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy            break;
1006b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPatch: {
1007b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* xDivs = NULL;
1008b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                int32_t* yDivs = NULL;
10094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                uint32_t* colors = NULL;
1010b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t xDivsCount = 0;
1011b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                uint32_t yDivsCount = 0;
10124bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                int8_t numColors = 0;
1013b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1014b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                SkBitmap* bitmap = getBitmap();
1015b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1016b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                xDivs = getInts(xDivsCount);
1017b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                yDivs = getInts(yDivsCount);
10184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                colors = getUInts(numColors);
1019b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
10209ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float left = getFloat();
10219ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float top = getFloat();
10229ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float right = getFloat();
10239ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                float bottom = getFloat();
10245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
10259ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy
1026daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
10274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy                renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
10289ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                        numColors, left, top, right, bottom, paint);
1029b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1030b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1031b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawColor: {
103233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
103333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t xferMode = getInt();
1034daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
1035daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawColor(color, (SkXfermode::Mode) xferMode);
1036b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1037b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1038b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawRect: {
1039daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1040daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1041daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1042daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1044daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
1045a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        f1, f2, f3, f4, paint);
1046daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRect(f1, f2, f3, f4, paint);
1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1048b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
104901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawRoundRect: {
1050daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1051daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1052daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1053daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1054daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1055daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
10565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1057daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
1058a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
1059daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
106001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
106101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
106201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            case DrawCircle: {
1063daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1064daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1065daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
10665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1067daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
1068a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, paint);
1069daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawCircle(f1, f2, f3, paint);
107001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            }
107101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            break;
1072c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            case DrawOval: {
1073daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1074daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1075daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1076daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
10775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1078daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
1079a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
1080daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawOval(f1, f2, f3, f4, paint);
1081c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            }
1082c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy            break;
10838b2f5267f16c295f12faab810527cd6311997e34Romain Guy            case DrawArc: {
1084daf98e941e140e8739458126640183b9f296a2abChet Haase                float f1 = getFloat();
1085daf98e941e140e8739458126640183b9f296a2abChet Haase                float f2 = getFloat();
1086daf98e941e140e8739458126640183b9f296a2abChet Haase                float f3 = getFloat();
1087daf98e941e140e8739458126640183b9f296a2abChet Haase                float f4 = getFloat();
1088daf98e941e140e8739458126640183b9f296a2abChet Haase                float f5 = getFloat();
1089daf98e941e140e8739458126640183b9f296a2abChet Haase                float f6 = getFloat();
109033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t i1 = getInt();
10915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1092daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
1093a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
1094daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
10958b2f5267f16c295f12faab810527cd6311997e34Romain Guy            }
10968b2f5267f16c295f12faab810527cd6311997e34Romain Guy            break;
1097b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawPath: {
1098daf98e941e140e8739458126640183b9f296a2abChet Haase                SkPath* path = getPath();
10995ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1100daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
1101daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.drawPath(path, paint);
1102b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1103b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1104b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawLines: {
110533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1106b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                float* points = getFloats(count);
11075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1108daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11099ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawLines(points, count, paint);
1110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1112ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            case DrawPoints: {
111333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = 0;
1114ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                float* points = getFloats(count);
11155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1116ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11179ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy                renderer.drawPoints(points, count, paint);
1118ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            }
1119ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy            break;
1120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case DrawText: {
1121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                getText(&text);
112233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
1123daf98e941e140e8739458126640183b9f296a2abChet Haase                float x = getFloat();
1124daf98e941e140e8739458126640183b9f296a2abChet Haase                float y = getFloat();
11255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1126cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                float length = getFloat();
1127cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
1128cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                        OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
1129cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy                renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1132325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            case DrawTextOnPath: {
1133325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                getText(&text);
1134325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                int32_t count = getInt();
1135325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPath* path = getPath();
1136325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float hOffset = getFloat();
1137325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                float vOffset = getFloat();
1138325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                SkPaint* paint = getPaint(renderer);
1139325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
1140325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                    text.text(), text.length(), count, paint);
1141325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                renderer.drawTextOnPath(text.text(), text.length(), count, path,
1142325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy                        hOffset, vOffset, paint);
1143325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            }
1144325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            break;
1145eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            case DrawPosText: {
1146eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                getText(&text);
114733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t count = getInt();
114833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t positionsCount = 0;
1149eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                float* positions = getFloats(positionsCount);
11505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                SkPaint* paint = getPaint(renderer);
1151eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
1152eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                        OP_NAMES[op], text.text(), text.length(), count, paint);
1153eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy                renderer.drawPosText(text.text(), text.length(), count, positions, paint);
1154eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            }
1155eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            break;
1156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShader: {
1157daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShader();
1159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShader: {
1162daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaShader* shader = getShader();
1163daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader);
1164daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShader(shader);
1165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetColorFilter: {
1168daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetColorFilter();
1170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupColorFilter: {
1173daf98e941e140e8739458126640183b9f296a2abChet Haase                SkiaColorFilter *colorFilter = getColorFilter();
1174daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter);
1175daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupColorFilter(colorFilter);
1176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case ResetShadow: {
1179daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
1180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy                renderer.resetShadow();
1181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            }
1182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            break;
1183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            case SetupShadow: {
1184daf98e941e140e8739458126640183b9f296a2abChet Haase                float radius = getFloat();
1185daf98e941e140e8739458126640183b9f296a2abChet Haase                float dx = getFloat();
1186daf98e941e140e8739458126640183b9f296a2abChet Haase                float dy = getFloat();
118733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t color = getInt();
1188daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op],
1189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        radius, dx, dy, color);
1190daf98e941e140e8739458126640183b9f296a2abChet Haase                renderer.setupShadow(radius, dx, dy, color);
1191daf98e941e140e8739458126640183b9f296a2abChet Haase            }
1192daf98e941e140e8739458126640183b9f296a2abChet Haase            break;
11935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case ResetPaintFilter: {
11945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
11955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.resetPaintFilter();
11965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
11975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
11985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            case SetupPaintFilter: {
119933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t clearBits = getInt();
120033f6beb10f98e8ba96250e284876d607055d278dRomain Guy                int32_t setBits = getInt();
12015ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op],
12025ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                        clearBits, setBits);
12035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy                renderer.setupPaintFilter(clearBits, setBits);
12045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            }
12055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            break;
1206daf98e941e140e8739458126640183b9f296a2abChet Haase            default:
1207daf98e941e140e8739458126640183b9f296a2abChet Haase                DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s",
1208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                        (char*) indent, OP_NAMES[op]);
1209daf98e941e140e8739458126640183b9f296a2abChet Haase                break;
1210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
1211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
1212ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    if (USE_DISPLAY_LIST_PROPERTIES) {
1214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
1215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        renderer.restoreToCount(restoreTo);
1216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
121713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    renderer.endMark();
121813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
1219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(),
12206554943a1dd6854c0f4976900956e556767b49e1Romain Guy            drawGlStatus);
12216554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return drawGlStatus;
1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
12254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure
12264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE),
122933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) {
12304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() {
12334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    reset();
12344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() {
12374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    mWriter.reset();
12385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
12395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Caches& caches = Caches::getInstance();
12405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    for (size_t i = 0; i < mBitmapResources.size(); i++) {
1241d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i));
12425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
12435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    mBitmapResources.clear();
1244d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
1245d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    for (size_t i = 0; i < mFilterResources.size(); i++) {
1246d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i));
1247d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
1248d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    mFilterResources.clear();
1249d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
125043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    for (size_t i = 0; i < mShaders.size(); i++) {
1251d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        caches.resourceCache.decrementRefcount(mShaders.itemAt(i));
125243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    }
125324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaders.clear();
125424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    mShaderMap.clear();
125543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy
125643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaints.clear();
125743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy    mPaintMap.clear();
1258d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
12592fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPaths.clear();
12602fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    mPathMap.clear();
1261d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
1262d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    mMatrices.clear();
126304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
126404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    mHasDrawOps = false;
12654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
12664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations
12694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
12704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1271162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) {
1272162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    if (!displayList) {
1273162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList = new DisplayList(*this);
12745977baa1fa24125c148a72699b53e62abaf08960Chet Haase    } else {
1275162a0217563f4665da6eb183dfce0fef740f641fJeff Brown        displayList->initFromDisplayListRenderer(*this, true);
12765977baa1fa24125c148a72699b53e62abaf08960Chet Haase    }
127704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    displayList->setRenderable(mHasDrawOps);
1278162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    return displayList;
12795977baa1fa24125c148a72699b53e62abaf08960Chet Haase}
12805977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) {
1282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1);
1283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mWidth = width;
1285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mHeight = height;
1286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
12887d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top,
12897d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy        float right, float bottom, bool opaque) {
1290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot = new Snapshot(mFirstSnapshot,
1291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag);
1292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSaveCount = 1;
1293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight);
129427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = -1;
129527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy}
129627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
129727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() {
129827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    insertRestoreToCount();
129933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}
1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1302daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() {
1303daf98e941e140e8739458126640183b9f296a2abChet Haase}
1304daf98e941e140e8739458126640183b9f296a2abChet Haase
13052b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() {
13064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13086554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) {
1309cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // Ignore dirty during recording, it matters only when we replay
1310daf98e941e140e8739458126640183b9f296a2abChet Haase    addOp(DisplayList::DrawGLFunction);
1311daf98e941e140e8739458126640183b9f296a2abChet Haase    addInt((int) functor);
13126554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone; // No invalidate needed at record-time
1313daf98e941e140e8739458126640183b9f296a2abChet Haase}
1314daf98e941e140e8739458126640183b9f296a2abChet Haase
13154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) {
1316b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Save);
13174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
13184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::save(flags);
13194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() {
132204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    if (mRestoreSaveCount < 0) {
132333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        restoreToCount(getSaveCount() - 1);
132433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return;
132504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
132633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
132733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mRestoreSaveCount--;
132833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restore();
13304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) {
133327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    mRestoreSaveCount = saveCount;
133433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertTranlate();
13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::restoreToCount(saveCount);
13364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom,
13395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* p, int flags) {
1340b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SaveLayer);
13414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(p);
13434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(flags);
1344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    return OpenGLRenderer::save(flags);
13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom,
13485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        int alpha, int flags) {
13495b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addOp(DisplayList::SaveLayerAlpha);
13505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addBounds(left, top, right, bottom);
13515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(alpha);
13525b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    addInt(flags);
13535b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return OpenGLRenderer::save(flags);
13545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
13555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) {
135733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mHasTranslate = true;
135833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateX += dx;
135933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    mTranslateY += dy;
136033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    insertRestoreToCount();
13614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::translate(dx, dy);
13624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) {
1365b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Rotate);
13664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(degrees);
13674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::rotate(degrees);
13684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) {
1371b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::Scale);
13724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(sx, sy);
13734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::scale(sx, sy);
13744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1376807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) {
1377807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addOp(DisplayList::Skew);
1378807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    addPoint(sx, sy);
1379807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    OpenGLRenderer::skew(sx, sy);
1380807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy}
1381807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
13824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) {
1383b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetMatrix);
13844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
13854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::setMatrix(matrix);
13864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) {
1389b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ConcatMatrix);
13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
13914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    OpenGLRenderer::concatMatrix(matrix);
13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
13934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
13944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom,
13954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SkRegion::Op op) {
1396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ClipRect);
13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(op);
13994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    return OpenGLRenderer::clipRect(left, top, right, bottom, op);
14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14026554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
140333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) {
1404cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // dirty is an out parameter and should not be recorded,
1405cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    // it matters only when replaying the display list
1406b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase
1407b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase    addOp(DisplayList::DrawDisplayList);
14080fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    addDisplayList(displayList);
14097b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    addSize(width, height);
141033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(flags);
14116554943a1dd6854c0f4976900956e556767b49e1Romain Guy    return DrawGlInfo::kStatusDone;
14120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy}
14130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
1414ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
14156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addOp(DisplayList::DrawLayer);
1416ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addInt((int) layer);
1417ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    addPoint(x, y);
14186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    addPaint(paint);
14196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
14206c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
142133f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
142233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
142333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
14244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(left, top);
14264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
142733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
143033f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
143133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
143233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const mat4 transform(*matrix);
143333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    transform.mapRect(r);
143433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
143533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(r.left, r.top, r.right, r.bottom);
143633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject);
14374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addMatrix(matrix);
14394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
144033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
14444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        float srcRight, float srcBottom, float dstLeft, float dstTop,
14455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float dstRight, float dstBottom, SkPaint* paint) {
144633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
144733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject);
14484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(srcLeft, srcTop, srcRight, srcBottom);
14504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(dstLeft, dstTop, dstRight, dstBottom);
14514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
145233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14555a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
14565a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        float* vertices, int* colors, SkPaint* paint) {
14575a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addOp(DisplayList::DrawBitmapMesh);
14585a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addBitmap(bitmap);
14595a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshWidth);
14605a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addInt(meshHeight);
14615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2);
14625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    if (colors) {
14635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(1);
14645a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInts(colors, (meshWidth + 1) * (meshHeight + 1));
14655a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    } else {
14665a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        addInt(0);
14675a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    }
14685a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    addPaint(paint);
14695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy}
14705a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy
14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
14724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
14735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        float left, float top, float right, float bottom, SkPaint* paint) {
147433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left, top, right, bottom);
147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPatch, reject);
14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBitmap(bitmap);
14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(xDivs, width);
14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInts(yDivs, height);
14794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    addUInts(colors, numColors);
14804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
148233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
1486b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawColor);
14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
14884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(mode);
14894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
14925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        SkPaint* paint) {
149333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
149433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
149533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRect, reject);
14964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addBounds(left, top, right, bottom);
14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
149833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
150101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
1502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        float rx, float ry, SkPaint* paint) {
150333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
150433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            quickReject(left, top, right, bottom);
150533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawRoundRect, reject);
150601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addBounds(left, top, right, bottom);
150701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(rx, ry);
150801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
150933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
151001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
151101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
151201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
151301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addOp(DisplayList::DrawCircle);
151401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPoint(x, y);
151501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addFloat(radius);
151601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    addPaint(paint);
151701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
151801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy
1519c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
1520c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        SkPaint* paint) {
1521c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addOp(DisplayList::DrawOval);
1522c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addBounds(left, top, right, bottom);
1523c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    addPaint(paint);
1524c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy}
1525c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy
15268b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
15278b2f5267f16c295f12faab810527cd6311997e34Romain Guy        float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
152882d41a515368236e56454bd84023bebd6306f6b7Romain Guy    addOp(DisplayList::DrawArc);
15298b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addBounds(left, top, right, bottom);
15308b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPoint(startAngle, sweepAngle);
15318b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addInt(useCenter ? 1 : 0);
15328b2f5267f16c295f12faab810527cd6311997e34Romain Guy    addPaint(paint);
15338b2f5267f16c295f12faab810527cd6311997e34Romain Guy}
15348b2f5267f16c295f12faab810527cd6311997e34Romain Guy
15354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
153633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float left, top, offset;
153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t width, height;
153833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    computePathBounds(path, paint, left, top, offset, width, height);
153933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
154033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    const bool reject = quickReject(left - offset, top - offset, width, height);
154133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawPath, reject);
15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPath(path);
15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
154433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15475c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
1548b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::DrawLines);
15494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloats(points, count);
15504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
1551ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy}
1552ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy
1553ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
1554ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addOp(DisplayList::DrawPoints);
1555ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addFloats(points, count);
1556ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    addPaint(paint);
15574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
1560cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy        float x, float y, SkPaint* paint, float length) {
156133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
156233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
15638f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    // TODO: We should probably make a copy of the paint instead of modifying
15648f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       it; modifying the paint will change its generationID the first
15658f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       time, which might impact caches. More investigation needed to
15668f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       see if it matters.
15678f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       If we make a copy, then drawTextDecorations() should *not* make
15688f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    //       its own copy as it does right now.
1569c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio    // Beware: this needs Glyph encoding (already done on the Paint constructor)
15708f9a9f61ab793d9387a5942b307e74324704893bRomain Guy    paint->setAntiAlias(true);
157133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (length < 0.0f) length = paint->measureText(text, bytesCount);
157233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
157333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool reject = false;
157433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) {
157533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        SkPaint::FontMetrics metrics;
157633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        paint->getFontMetrics(&metrics, 0.0f);
157733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom);
157833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
157933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
158033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* location = addOp(DisplayList::DrawText, reject);
158133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addText(text, bytesCount);
158233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addInt(count);
158333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addPoint(x, y);
15844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPaint(paint);
158533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addFloat(length);
158633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    addSkip(location);
15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
15884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1589325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
1590325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
1591325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    if (!text || count <= 0) return;
1592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addOp(DisplayList::DrawTextOnPath);
1593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addText(text, bytesCount);
1594325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addInt(count);
1595325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPath(path);
1596325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(hOffset);
1597325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addFloat(vOffset);
1598325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    paint->setAntiAlias(true);
1599325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    addPaint(paint);
1600325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy}
1601325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
1602eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
1603eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        const float* positions, SkPaint* paint) {
160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    if (!text || count <= 0) return;
1605eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addOp(DisplayList::DrawPosText);
1606eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addText(text, bytesCount);
1607eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addInt(count);
1608eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addFloats(positions, count * 2);
1609eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    paint->setAntiAlias(true);
1610eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    addPaint(paint);
1611eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy}
1612eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy
16134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() {
1614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShader);
16154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) {
16185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addOp(DisplayList::SetupShader);
16195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    addShader(shader);
16204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() {
1623b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetColorFilter);
16244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {
1627ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addOp(DisplayList::SetupColorFilter);
1628ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    addColorFilter(filter);
16294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() {
1632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::ResetShadow);
16334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
1636b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    addOp(DisplayList::SetupShadow);
16374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addFloat(radius);
16384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addPoint(dx, dy);
16394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    addInt(color);
16404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
16414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
16425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() {
16435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::ResetPaintFilter);
16445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) {
16475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addOp(DisplayList::SetupPaintFilter);
16485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(clearBits);
16495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    addInt(setBits);
16505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy}
16515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
1654