DisplayListRenderer.cpp revision bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3
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 199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 229c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h" 234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2413631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <utils/String8.h> 2513631f3da855f200a151e7837ed9f6b079622b58Romain Guy 264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 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 96b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain GuyDisplayList::DisplayList(const DisplayListRenderer& recorder) { 975977baa1fa24125c148a72699b53e62abaf08960Chet Haase initFromDisplayListRenderer(recorder); 985977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 995977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1005977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() { 101d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 102d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase} 103d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 104bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { 105bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy if (displayList) { 106bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy DISPLAY_LIST_LOGD("Deferring display list destruction"); 107bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy Caches::getInstance().deleteDisplayListDeferred(displayList); 108bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy } 109bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy} 110bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 111d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() { 1125977baa1fa24125c148a72699b53e62abaf08960Chet Haase sk_free((void*) mReader.base()); 1135977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1145977baa1fa24125c148a72699b53e62abaf08960Chet Haase Caches& caches = Caches::getInstance(); 1155977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 1175977baa1fa24125c148a72699b53e62abaf08960Chet Haase caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); 1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1195977baa1fa24125c148a72699b53e62abaf08960Chet Haase mBitmapResources.clear(); 1205977baa1fa24125c148a72699b53e62abaf08960Chet Haase 121d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 122d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); 123d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 124d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.clear(); 125d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 12624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 12743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); 128d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.destructor(mShaders.itemAt(i)); 1295977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 13024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaders.clear(); 1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mPaints.size(); i++) { 1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mPaints.itemAt(i); 1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase mPaints.clear(); 1365977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < mPaths.size(); i++) { 1381af23a32d879db330eb5a08b21090ec60b604a32Romain Guy SkPath* path = mPaths.itemAt(i); 1391af23a32d879db330eb5a08b21090ec60b604a32Romain Guy caches.pathCache.remove(path); 1401af23a32d879db330eb5a08b21090ec60b604a32Romain Guy delete path; 1412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 1422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 1432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mMatrices.size(); i++) { 1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mMatrices.itemAt(i); 1465977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase mMatrices.clear(); 1485977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1495977baa1fa24125c148a72699b53e62abaf08960Chet Haase 150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { 151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writer = recorder.writeStream(); 152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy init(); 153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (writer.size() == 0) { 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return; 156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 158d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase if (reusing) { 159d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase // re-using display list - clear out previous allocations 160d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 161d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase } 162d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 16365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = writer.size(); 16465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy void* buffer = sk_malloc_throw(mSize); 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy writer.flatten(buffer); 16665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mReader.setMemory(buffer, mSize); 167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources(); 1715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < bitmapResources.size(); i++) { 1725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = bitmapResources.itemAt(i); 1735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(resource); 1745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(resource); 175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 176d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 177d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources(); 178d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < filterResources.size(); i++) { 179d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaColorFilter* resource = filterResources.itemAt(i); 180d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.add(resource); 181d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.incrementRefcount(resource); 182d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 183d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 18424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*> &shaders = recorder.getShaders(); 18524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < shaders.size(); i++) { 186d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaShader* resource = shaders.itemAt(i); 187d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mShaders.add(resource); 188d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.incrementRefcount(resource); 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 191d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*> &paints = recorder.getPaints(); 192d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < paints.size(); i++) { 193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paints.itemAt(i)); 194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 195d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 1962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*> &paths = recorder.getPaths(); 1972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < paths.size(); i++) { 1982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.add(paths.itemAt(i)); 1992fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 201d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*> &matrices = recorder.getMatrices(); 202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < matrices.size(); i++) { 203d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.add(matrices.itemAt(i)); 204d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = 0; 20904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = true; 21065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy} 21165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 21265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() { 21365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy return mSize; 214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 216ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 217ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the 218ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function. 219ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 220ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { 221ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase TextContainer text; 222ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 223ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t count = (level + 1) * 2; 224ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase char indent[count + 1]; 225ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase for (uint32_t i = 0; i < count; i++) { 226ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[i] = ' '; 227ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 228ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[count] = '\0'; 22913631f3da855f200a151e7837ed9f6b079622b58Romain Guy ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string()); 230ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 231ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int saveCount = renderer.getSaveCount() - 1; 232ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 233ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase mReader.rewind(); 234ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 235ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase while (!mReader.eof()) { 236ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int op = mReader.readInt(); 23733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 23833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int skip = mReader.readInt(); 23933f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%sSkip %d", (char*) indent, skip); 24033f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 24133f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 242ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 243ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase switch (op) { 244ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawGLFunction: { 245ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Functor *functor = (Functor *) getInt(); 2465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 247ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 248ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 249ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Save: { 250ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int rendererNum = getInt(); 2515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 252ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 253ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 254ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Restore: { 2555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 256ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 257ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 258ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case RestoreToCount: { 259ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int restoreCount = saveCount + getInt(); 2605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayer: { 264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 2685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 2705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 274ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayerAlpha: { 275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 278ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int alpha = getInt(); 280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 2815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 283ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 284ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 285ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Translate: { 286ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 287ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 2885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Rotate: { 292ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float rotation = getFloat(); 2935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Scale: { 297ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 2995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 301ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Skew: { 303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 3055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 306ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetMatrix: { 309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 3105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ConcatMatrix: { 314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 3155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ClipRect: { 319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int regionOp = getInt(); 3245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase f1, f2, f3, f4, regionOp); 326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawDisplayList: { 329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase DisplayList* displayList = getDisplayList(); 330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t width = getUInt(); 331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t height = getUInt(); 33233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 33333f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 33433f6beb10f98e8ba96250e284876d607055d278dRomain Guy displayList, width, height, flags, level + 1); 335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase renderer.outputDisplayList(displayList, level + 1); 336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLayer: { 339ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Layer* layer = (Layer*) getInt(); 340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 3425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase layer, x, y, paint); 345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmap: { 348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 3515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bitmap, x, y, paint); 354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMatrix: { 357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 3595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bitmap, matrix, paint); 362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapRect: { 365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f7 = getFloat(); 373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f8 = getFloat(); 3745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMesh: { 380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int verticesCount = 0; 381ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t colorsCount = 0; 382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshWidth = getInt(); 384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshHeight = getInt(); 385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* vertices = getFloats(verticesCount); 386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bool hasColors = getInt(); 387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int* colors = hasColors ? getInts(colorsCount) : NULL; 3885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPatch: { 393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* xDivs = NULL; 394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* yDivs = NULL; 395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t* colors = NULL; 396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t xDivsCount = 0; 397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t yDivsCount = 0; 398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int8_t numColors = 0; 399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase xDivs = getInts(xDivsCount); 401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase yDivs = getInts(yDivsCount); 402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase colors = getUInts(numColors); 403a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float left = getFloat(); 404a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float top = getFloat(); 405a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float right = getFloat(); 406a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float bottom = getFloat(); 4075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op], 409a62f172215727a1e00af0cb934904e00926a86c9Romain Guy left, top, right, bottom); 410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawColor: { 413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int xferMode = getInt(); 4155baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRect: { 419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 4235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase f1, f2, f3, f4, paint); 426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRoundRect: { 429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 4355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawCircle: { 441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 4445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %p", 446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawOval: { 450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 452ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 453ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawArc: { 460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int i1 = getInt(); 4675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4685baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPath: { 473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkPath* path = getPath(); 4745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLines: { 479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 4815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 484ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 485ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPoints: { 486ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 4885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4895baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawText: { 493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase getText(&text); 494325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 498cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float length = getFloat(); 4995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op], 500cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy text.text(), text.length(), count, x, y, paint, length); 501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 503325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 504325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 505325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 506325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 507325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 508325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 509325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 510325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 511325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 512325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 513325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 514eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 515eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 516eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int count = getInt(); 517eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int positionsCount = 0; 518eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 5195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 520eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 521eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy text.text(), text.length(), count, paint); 522eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShader: { 5245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShader: { 528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaShader* shader = getShader(); 5295baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetColorFilter: { 5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupColorFilter: { 537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 5385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShadow: { 5425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShadow: { 546ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float radius = getFloat(); 547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dx = getFloat(); 548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dy = getFloat(); 549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 5505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase radius, dx, dy, color); 552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 5555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 5565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 5575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 5585ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 5595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int clearBits = getInt(); 5605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int setBits = getInt(); 5615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits); 5625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 564ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase default: 5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("Display List error: op not handled: %s%s", 566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase (char*) indent, OP_NAMES[op]); 567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 5715baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%sDone", (char*) indent + 2); 572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase} 573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked 576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the 577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view. 578ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 57933f6beb10f98e8ba96250e284876d607055d278dRomain Guybool DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) { 580daf98e941e140e8739458126640183b9f296a2abChet Haase bool needsInvalidate = false; 581b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 582b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 583b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 584ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 585ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy uint32_t count = (level + 1) * 2; 586ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy char indent[count + 1]; 587ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy for (uint32_t i = 0; i < count; i++) { 588ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[i] = ' '; 589ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy } 590ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[count] = '\0'; 59113631f3da855f200a151e7837ed9f6b079622b58Romain Guy DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string()); 592ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 593b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 59413631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark(mName.string()); 59513631f3da855f200a151e7837ed9f6b079622b58Romain Guy 5969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 597ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy int saveCount = renderer.getSaveCount() - 1; 598b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 5995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int op = mReader.readInt(); 60033f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 60133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t skip = mReader.readInt() * 4; 60233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) { 60333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mReader.skip(skip); 60433f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent, 60533f6beb10f98e8ba96250e284876d607055d278dRomain Guy OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip); 60633f6beb10f98e8ba96250e284876d607055d278dRomain Guy continue; 60733f6beb10f98e8ba96250e284876d607055d278dRomain Guy } else { 60833f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 60933f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 61033f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 6119c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.writeCommand(level, op); 612ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 6135b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy switch (op) { 614daf98e941e140e8739458126640183b9f296a2abChet Haase case DrawGLFunction: { 615daf98e941e140e8739458126640183b9f296a2abChet Haase Functor *functor = (Functor *) getInt(); 616daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 61713631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark("GL functor"); 618cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy needsInvalidate |= renderer.callDrawGLFunction(functor, dirty); 61913631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 620daf98e941e140e8739458126640183b9f296a2abChet Haase } 621daf98e941e140e8739458126640183b9f296a2abChet Haase break; 622b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 62333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t rendererNum = getInt(); 624daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 625daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.save(rendererNum); 626b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 627b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 629daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 630b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 631b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 632b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 633b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 63433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t restoreCount = saveCount + getInt(); 635daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 636daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.restoreToCount(restoreCount); 637b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 638b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 639b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 640daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 641daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 642daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 643daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 6445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 64533f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 646daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 647daf98e941e140e8739458126640183b9f296a2abChet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 648daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayer(f1, f2, f3, f4, paint, flags); 649b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 650b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 6515b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy case SaveLayerAlpha: { 652daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 653daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 654daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 655daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t alpha = getInt(); 65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 658daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 659daf98e941e140e8739458126640183b9f296a2abChet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 660daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); 6615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 6625b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy break; 663b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 664daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 665daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 666daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 667daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.translate(f1, f2); 668b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 669b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 670b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 671daf98e941e140e8739458126640183b9f296a2abChet Haase float rotation = getFloat(); 672daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 673daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.rotate(rotation); 674b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 675b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 676b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 677daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 678daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 679daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 680daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.scale(sx, sy); 681b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 682b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 683807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy case Skew: { 684daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 685daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 686daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 687daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.skew(sx, sy); 688807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy } 689807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy break; 690b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 691daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 692daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 693daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setMatrix(matrix); 694b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 695b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 696b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 697daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 698daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 699daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.concatMatrix(matrix); 700b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 701b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 702b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 703daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 704daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 705daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 706daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 70733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t regionOp = getInt(); 708daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 709daf98e941e140e8739458126640183b9f296a2abChet Haase f1, f2, f3, f4, regionOp); 710daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); 711b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 712b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 7130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy case DrawDisplayList: { 714daf98e941e140e8739458126640183b9f296a2abChet Haase DisplayList* displayList = getDisplayList(); 7157b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy uint32_t width = getUInt(); 7167b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy uint32_t height = getUInt(); 71733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 71833f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 71933f6beb10f98e8ba96250e284876d607055d278dRomain Guy displayList, width, height, flags, level + 1); 7207b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy needsInvalidate |= renderer.drawDisplayList(displayList, width, height, 72133f6beb10f98e8ba96250e284876d607055d278dRomain Guy dirty, flags, level + 1); 7220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 7230fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy break; 7246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy case DrawLayer: { 725daf98e941e140e8739458126640183b9f296a2abChet Haase Layer* layer = (Layer*) getInt(); 726daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 727daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 7285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 729daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 730daf98e941e140e8739458126640183b9f296a2abChet Haase layer, x, y, paint); 731daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawLayer(layer, x, y, paint); 7326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 7336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy break; 734b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 735daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 736daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 737daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 7385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 739daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 740daf98e941e140e8739458126640183b9f296a2abChet Haase bitmap, x, y, paint); 741daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, x, y, paint); 742b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 743b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 744b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 745daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 746daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 7475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 748daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 749daf98e941e140e8739458126640183b9f296a2abChet Haase bitmap, matrix, paint); 750daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, matrix, paint); 751b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 752b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 753b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 754daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 755daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 756daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 757daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 758daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 759daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 760daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 761daf98e941e140e8739458126640183b9f296a2abChet Haase float f7 = getFloat(); 762daf98e941e140e8739458126640183b9f296a2abChet Haase float f8 = getFloat(); 7635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 764daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 765daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 766daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 767b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 768b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 7695a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy case DrawBitmapMesh: { 77033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t verticesCount = 0; 7715a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t colorsCount = 0; 7725a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 7735a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy SkBitmap* bitmap = getBitmap(); 7745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshWidth = getInt(); 7755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshHeight = getInt(); 7765a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices = getFloats(verticesCount); 7775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy bool hasColors = getInt(); 77833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t* colors = hasColors ? getInts(colorsCount) : NULL; 7795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 7805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 781daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 7829ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint); 7835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 784a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy break; 785b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 786b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 787b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 7884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 789b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 790b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 7914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 792b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 793b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 794b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 795b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 796b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 7974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 798b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 7999ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float left = getFloat(); 8009ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float top = getFloat(); 8019ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float right = getFloat(); 8029ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float bottom = getFloat(); 8035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 8049ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy 805daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 8064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount, 8079ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy numColors, left, top, right, bottom, paint); 808b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 809b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 810b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 81133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 81233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t xferMode = getInt(); 813daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 814daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawColor(color, (SkXfermode::Mode) xferMode); 815b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 816b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 818daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 819daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 820daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 821daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 8225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 823daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 824daf98e941e140e8739458126640183b9f296a2abChet Haase f1, f2, f3, f4, paint); 825daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawRect(f1, f2, f3, f4, paint); 826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 827b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 82801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawRoundRect: { 829daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 830daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 831daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 832daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 833daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 834daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 8355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 836daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 837daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 838daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); 83901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 84001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 84101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawCircle: { 842daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 843daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 844daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 8455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 846daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", 847daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 848daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawCircle(f1, f2, f3, paint); 84901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 85001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 851c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy case DrawOval: { 852daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 853daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 854daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 855daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 8565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 857daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 858daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 859daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawOval(f1, f2, f3, f4, paint); 860c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy } 861c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy break; 8628b2f5267f16c295f12faab810527cd6311997e34Romain Guy case DrawArc: { 863daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 864daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 865daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 866daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 867daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 868daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 86933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t i1 = getInt(); 8705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 871daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 872daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 873daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); 8748b2f5267f16c295f12faab810527cd6311997e34Romain Guy } 8758b2f5267f16c295f12faab810527cd6311997e34Romain Guy break; 876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 877daf98e941e140e8739458126640183b9f296a2abChet Haase SkPath* path = getPath(); 8785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 879daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 880daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawPath(path, paint); 881b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 88433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 885b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 8865ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 887daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 8889ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawLines(points, count, paint); 889b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 890b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 891ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy case DrawPoints: { 89233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 893ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy float* points = getFloats(count); 8945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 895ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 8969ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawPoints(points, count, paint); 897ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 898ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy break; 899b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawText: { 900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getText(&text); 90133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 902daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 903daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 9045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 905cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float length = getFloat(); 906cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, 907cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length); 908cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy renderer.drawText(text.text(), text.length(), count, x, y, paint, length); 909b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 910b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 911325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 912325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 913325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 914325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 915325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 916325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 917325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 918325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 919325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 920325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderer.drawTextOnPath(text.text(), text.length(), count, path, 921325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy hOffset, vOffset, paint); 922325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 923325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 924eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 925eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 92633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 92733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t positionsCount = 0; 928eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 9295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 930eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, 931eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy OP_NAMES[op], text.text(), text.length(), count, paint); 932eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy renderer.drawPosText(text.text(), text.length(), count, positions, paint); 933eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 934eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy break; 935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 936daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 941daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaShader* shader = getShader(); 942daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 943daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShader(shader); 944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 946b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 947daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 948b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 949b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 950b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 951b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 952daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 953daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 954daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupColorFilter(colorFilter); 955b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 958daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 959b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 960b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 961b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 962b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 963daf98e941e140e8739458126640183b9f296a2abChet Haase float radius = getFloat(); 964daf98e941e140e8739458126640183b9f296a2abChet Haase float dx = getFloat(); 965daf98e941e140e8739458126640183b9f296a2abChet Haase float dy = getFloat(); 96633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 967daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 968daf98e941e140e8739458126640183b9f296a2abChet Haase radius, dx, dy, color); 969daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShadow(radius, dx, dy, color); 970daf98e941e140e8739458126640183b9f296a2abChet Haase } 971daf98e941e140e8739458126640183b9f296a2abChet Haase break; 9725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 9735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 9745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.resetPaintFilter(); 9755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 9765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 9775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 97833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t clearBits = getInt(); 97933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t setBits = getInt(); 9805ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], 9815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy clearBits, setBits); 9825ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.setupPaintFilter(clearBits, setBits); 9835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 9845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 985daf98e941e140e8739458126640183b9f296a2abChet Haase default: 986daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", 987daf98e941e140e8739458126640183b9f296a2abChet Haase (char*) indent, OP_NAMES[op]); 988daf98e941e140e8739458126640183b9f296a2abChet Haase break; 989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 990b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 991ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 99213631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 99313631f3da855f200a151e7837ed9f6b079622b58Romain Guy 994daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%sDone, returning %d", (char*) indent + 2, needsInvalidate); 995daf98e941e140e8739458126640183b9f296a2abChet Haase return needsInvalidate; 996b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 998b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 9994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 10004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 10014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 100233f6beb10f98e8ba96250e284876d607055d278dRomain GuyDisplayListRenderer::DisplayListRenderer(): mWriter(MIN_WRITER_SIZE), 100333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) { 10044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 10054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 10064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 10074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 10084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 10094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 10104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 10114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 10125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 10135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 10145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 1015d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); 10165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 10175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.clear(); 1018d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 1019d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 1020d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); 1021d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 1022d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.clear(); 1023d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 102443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 1025d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); 102643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy } 102724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaders.clear(); 102824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaderMap.clear(); 102943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy 103043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaints.clear(); 103143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaintMap.clear(); 1032d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 10332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 10342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.clear(); 1035d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 1036d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 103704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 103804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = false; 10394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 10404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 10414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 10424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 10434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 10444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1045162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) { 1046162a0217563f4665da6eb183dfce0fef740f641fJeff Brown if (!displayList) { 1047162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList = new DisplayList(*this); 10485977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 1049162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList->initFromDisplayListRenderer(*this, true); 10505977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 105104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy displayList->setRenderable(mHasDrawOps); 1052162a0217563f4665da6eb183dfce0fef740f641fJeff Brown return displayList; 10535977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 10545977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1055b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 1056b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 1057b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1058b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 1059b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 1060b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1061b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 10627d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top, 10637d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy float right, float bottom, bool opaque) { 1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 1065b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 1067b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 106827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 106927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 107027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 107127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() { 107227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 107333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 107427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy OpenGLRenderer::finish(); 1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1077daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() { 1078daf98e941e140e8739458126640183b9f296a2abChet Haase} 1079daf98e941e140e8739458126640183b9f296a2abChet Haase 10802b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() { 10814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 10824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1083cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guybool DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { 1084cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // Ignore dirty during recording, it matters only when we replay 1085daf98e941e140e8739458126640183b9f296a2abChet Haase addOp(DisplayList::DrawGLFunction); 1086daf98e941e140e8739458126640183b9f296a2abChet Haase addInt((int) functor); 1087daf98e941e140e8739458126640183b9f296a2abChet Haase return false; // No invalidate needed at record-time 1088daf98e941e140e8739458126640183b9f296a2abChet Haase} 1089daf98e941e140e8739458126640183b9f296a2abChet Haase 10904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 1091b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 10924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 10934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 10944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 10954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 10964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 109704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 109833f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 109933f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 110004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 110133f6beb10f98e8ba96250e284876d607055d278dRomain Guy 110233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 110333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 11044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 11054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 110827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 110933f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 11104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 11114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 11145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 1115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 11164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 11174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 11184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 1119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 11204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11225b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 11235b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 11245b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addOp(DisplayList::SaveLayerAlpha); 11255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addBounds(left, top, right, bottom); 11265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(alpha); 11275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(flags); 11285b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 11295b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 11305b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 11314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 113233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = true; 113333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 113433f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 113533f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 11364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 11374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 1140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 11414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 11424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 11434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 1146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 11474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 11484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 11494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1151807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) { 1152807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addOp(DisplayList::Skew); 1153807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addPoint(sx, sy); 1154807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy OpenGLRenderer::skew(sx, sy); 1155807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 1156807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 11574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 11594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 11604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 11614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 1164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 11654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 11664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 11674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 11704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 11724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 11734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 11744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 11754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 11764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 11777b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guybool DisplayListRenderer::drawDisplayList(DisplayList* displayList, 117833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) { 1179cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // dirty is an out parameter and should not be recorded, 1180cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // it matters only when replaying the display list 118133f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(0.0f, 0.0f, width, height); 118233f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawDisplayList, reject); 11830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addDisplayList(displayList); 11847b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy addSize(width, height); 118533f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(flags); 118633f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1187daf98e941e140e8739458126640183b9f296a2abChet Haase return false; 11880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 11890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 1190ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { 11916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addOp(DisplayList::DrawLayer); 1192ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addInt((int) layer); 1193ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addPoint(x, y); 11946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addPaint(paint); 11956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 11966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 119733f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { 119833f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height()); 119933f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmap, reject); 12004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 12014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 12024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 120333f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 12044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 120633f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) { 120733f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height()); 120833f6beb10f98e8ba96250e284876d607055d278dRomain Guy const mat4 transform(*matrix); 120933f6beb10f98e8ba96250e284876d607055d278dRomain Guy transform.mapRect(r); 121033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 121133f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(r.left, r.top, r.right, r.bottom); 121233f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject); 12134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 12144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 12154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 121633f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 12174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 12204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 12215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 122233f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom); 122333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject); 12244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 12254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 12264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 12274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 122833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 12294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 12325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint) { 12335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addOp(DisplayList::DrawBitmapMesh); 12345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addBitmap(bitmap); 12355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshWidth); 12365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshHeight); 12375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2); 12385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) { 12395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(1); 12405a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInts(colors, (meshWidth + 1) * (meshHeight + 1)); 12415a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } else { 12425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(0); 12435a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 12445a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addPaint(paint); 12455a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 12465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 12474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 12484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 12495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint) { 125033f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, right, bottom); 125133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPatch, reject); 12524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 12534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 12544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 12554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 12564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 12574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 125833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 12594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 1262b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 12654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 12685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 126933f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 127033f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 127133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRect, reject); 12724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 12734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 127433f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 12754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 127701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, 127801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint) { 127933f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 128033f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 128133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRoundRect, reject); 128201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addBounds(left, top, right, bottom); 128301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(rx, ry); 128401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 128533f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 128601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 128701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 128801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { 128901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addOp(DisplayList::DrawCircle); 129001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(x, y); 129101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addFloat(radius); 129201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 129301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 129401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1295c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom, 1296c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy SkPaint* paint) { 1297c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addOp(DisplayList::DrawOval); 1298c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addBounds(left, top, right, bottom); 1299c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addPaint(paint); 1300c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 1301c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 13028b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom, 13038b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { 130482d41a515368236e56454bd84023bebd6306f6b7Romain Guy addOp(DisplayList::DrawArc); 13058b2f5267f16c295f12faab810527cd6311997e34Romain Guy addBounds(left, top, right, bottom); 13068b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPoint(startAngle, sweepAngle); 13078b2f5267f16c295f12faab810527cd6311997e34Romain Guy addInt(useCenter ? 1 : 0); 13088b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPaint(paint); 13098b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 13108b2f5267f16c295f12faab810527cd6311997e34Romain Guy 13114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 131233f6beb10f98e8ba96250e284876d607055d278dRomain Guy float left, top, offset; 131333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, height; 131433f6beb10f98e8ba96250e284876d607055d278dRomain Guy computePathBounds(path, paint, left, top, offset, width, height); 131533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 131633f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left - offset, top - offset, width, height); 131733f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPath, reject); 13184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 13194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 132033f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 13214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13235c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 1324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 13254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 13264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 1327ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 1328ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 1329ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { 1330ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addOp(DisplayList::DrawPoints); 1331ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addFloats(points, count); 1332ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addPaint(paint); 13334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 1336cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float x, float y, SkPaint* paint, float length) { 133733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (!text || count <= 0) return; 133833f6beb10f98e8ba96250e284876d607055d278dRomain Guy 13398f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // TODO: We should probably make a copy of the paint instead of modifying 13408f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // it; modifying the paint will change its generationID the first 13418f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // time, which might impact caches. More investigation needed to 13428f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // see if it matters. 13438f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // If we make a copy, then drawTextDecorations() should *not* make 13448f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // its own copy as it does right now. 1345c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio // Beware: this needs Glyph encoding (already done on the Paint constructor) 13468f9a9f61ab793d9387a5942b307e74324704893bRomain Guy paint->setAntiAlias(true); 134733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (length < 0.0f) length = paint->measureText(text, bytesCount); 134833f6beb10f98e8ba96250e284876d607055d278dRomain Guy 134933f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool reject = false; 135033f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) { 135133f6beb10f98e8ba96250e284876d607055d278dRomain Guy SkPaint::FontMetrics metrics; 135233f6beb10f98e8ba96250e284876d607055d278dRomain Guy paint->getFontMetrics(&metrics, 0.0f); 135333f6beb10f98e8ba96250e284876d607055d278dRomain Guy reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom); 135433f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 135533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 135633f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawText, reject); 135733f6beb10f98e8ba96250e284876d607055d278dRomain Guy addText(text, bytesCount); 135833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(count); 135933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addPoint(x, y); 13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 136133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addFloat(length); 136233f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1365325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, 1366325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path, float hOffset, float vOffset, SkPaint* paint) { 1367325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy if (!text || count <= 0) return; 1368325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addOp(DisplayList::DrawTextOnPath); 1369325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addText(text, bytesCount); 1370325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addInt(count); 1371325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addPath(path); 1372325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addFloat(hOffset); 1373325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addFloat(vOffset); 1374325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy paint->setAntiAlias(true); 1375325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addPaint(paint); 1376325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 1377325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 1378eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, 1379eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy const float* positions, SkPaint* paint) { 138033f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (!text || count <= 0) return; 1381eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addOp(DisplayList::DrawPosText); 1382eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addText(text, bytesCount); 1383eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addInt(count); 1384eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addFloats(positions, count * 2); 1385eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy paint->setAntiAlias(true); 1386eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addPaint(paint); 1387eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 1388eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 1390b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 13914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 13945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addOp(DisplayList::SetupShader); 13955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addShader(shader); 13964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 1403ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addOp(DisplayList::SetupColorFilter); 1404ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addColorFilter(filter); 14054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 1408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 1412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() { 14195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::ResetPaintFilter); 14205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 14215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 14225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) { 14235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::SetupPaintFilter); 14245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(clearBits); 14255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(setBits); 14265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 14275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 1430