DisplayListRenderer.cpp revision 7c25aab491707f7324f9941b8cfa9bd2b4b97e76
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/* 24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project 34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License. 64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at 74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software 114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and 144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License. 154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer" 184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h> 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h> 226554943a1dd6854c0f4976900956e556767b49e1Romain Guy 239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h" 2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = { 35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Save", 36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Restore", 37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "RestoreToCount", 38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayer", 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayerAlpha", 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Translate", 41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Rotate", 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Scale", 434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy "Skew", 44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetMatrix", 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ConcatMatrix", 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ClipRect", 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawDisplayList", 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLayer", 49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmap", 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapMatrix", 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapRect", 52e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy "DrawBitmapData", 535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy "DrawBitmapMesh", 54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPatch", 55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawColor", 56ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawRect", 5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawRoundRect", 5801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawCircle", 59c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy "DrawOval", 608b2f5267f16c295f12faab810527cd6311997e34Romain Guy "DrawArc", 61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPath", 62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLines", 63ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy "DrawPoints", 64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy "DrawTextOnPath", 65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy "DrawPosText", 66c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy "DrawText", 67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShader", 68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupShader", 69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetColorFilter", 70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupColorFilter", 71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShadow", 72daf98e941e140e8739458126640183b9f296a2abChet Haase "SetupShadow", 735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "ResetPaintFilter", 745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "SetupPaintFilter", 75daf98e941e140e8739458126640183b9f296a2abChet Haase "DrawGLFunction" 76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy}; 77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) { 799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (logBuffer.isEmpty()) { 819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase return; 829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 8365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase FILE *file = fdopen(fd, "a"); 8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fprintf(file, "\nRecent DisplayList operations\n"); 879c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.outputCommands(file, OP_NAMES); 8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy String8 cachesLog; 9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy Caches::getInstance().dumpMemoryUsage(cachesLog); 9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\nCaches:\n%s", cachesLog.string()); 9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\n"); 9365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fflush(file); 959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 97491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) : 989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL), 999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix(NULL), mAnimationMatrix(NULL) { 100491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase 1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase initFromDisplayListRenderer(recorder); 1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1045977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() { 105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase} 107d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 108bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { 109bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy if (displayList) { 110bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy DISPLAY_LIST_LOGD("Deferring display list destruction"); 111bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy Caches::getInstance().deleteDisplayListDeferred(displayList); 112bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy } 113bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy} 114bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 115d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() { 1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase sk_free((void*) mReader.base()); 117034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy mReader.setMemory(NULL, 0); 1185977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformMatrix; 1201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformCamera; 1211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformMatrix3D; 1221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mStaticMatrix; 1231271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mAnimationMatrix; 12458ecc204fbcacef34806290492384677a330d4d4Romain Guy 1251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix = NULL; 1261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformCamera = NULL; 1271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix3D = NULL; 1281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix = NULL; 1291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix = NULL; 130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase Caches& caches = Caches::getInstance(); 13254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy caches.unregisterFunctors(mFunctorCount); 13358ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.lock(); 1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1355977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 13658ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i)); 1375977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1385977baa1fa24125c148a72699b53e62abaf08960Chet Haase 13949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) { 14049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i); 14158ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(bitmap); 14258ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.destructorLocked(bitmap); 14349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 14449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 145d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 14658ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i)); 147d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 148d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 14924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 15058ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i)); 15158ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.destructorLocked(mShaders.itemAt(i)); 1525977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 15358ecc204fbcacef34806290492384677a330d4d4Romain Guy 15458ecc204fbcacef34806290492384677a330d4d4Romain Guy for (size_t i = 0; i < mSourcePaths.size(); i++) { 15558ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); 15658ecc204fbcacef34806290492384677a330d4d4Romain Guy } 15758ecc204fbcacef34806290492384677a330d4d4Romain Guy 158603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < mLayers.size(); i++) { 159603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); 160603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 161603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 16258ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.unlock(); 1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mPaints.size(); i++) { 1655977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mPaints.itemAt(i); 1665977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1675977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < mPaths.size(); i++) { 1691af23a32d879db330eb5a08b21090ec60b604a32Romain Guy SkPath* path = mPaths.itemAt(i); 1701af23a32d879db330eb5a08b21090ec60b604a32Romain Guy caches.pathCache.remove(path); 1711af23a32d879db330eb5a08b21090ec60b604a32Romain Guy delete path; 1722fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 173d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 1745977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mMatrices.size(); i++) { 1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mMatrices.itemAt(i); 1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 17758ecc204fbcacef34806290492384677a330d4d4Romain Guy 17858ecc204fbcacef34806290492384677a330d4d4Romain Guy mBitmapResources.clear(); 17958ecc204fbcacef34806290492384677a330d4d4Romain Guy mOwnedBitmapResources.clear(); 18058ecc204fbcacef34806290492384677a330d4d4Romain Guy mFilterResources.clear(); 18158ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaders.clear(); 18258ecc204fbcacef34806290492384677a330d4d4Romain Guy mSourcePaths.clear(); 18358ecc204fbcacef34806290492384677a330d4d4Romain Guy mPaints.clear(); 18458ecc204fbcacef34806290492384677a330d4d4Romain Guy mPaths.clear(); 1855977baa1fa24125c148a72699b53e62abaf08960Chet Haase mMatrices.clear(); 186603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.clear(); 1875977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1896a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haasevoid DisplayList::reset() { 1906a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase clearResources(); 1916a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase init(); 1926a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase} 1936a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase 194d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 196d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase if (reusing) { 197d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase // re-using display list - clear out previous allocations 198d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 199d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase } 200034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy 201034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy init(); 202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 2036a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase const SkWriter32& writer = recorder.writeStream(); 204034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy if (writer.size() == 0) { 205034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy return; 206034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy } 207034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy 20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = writer.size(); 20965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy void* buffer = sk_malloc_throw(mSize); 210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy writer.flatten(buffer); 21165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mReader.setMemory(buffer, mSize); 212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 21354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount = recorder.getFunctorCount(); 21454c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 21654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy caches.registerFunctors(mFunctorCount); 21758ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.lock(); 218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 21949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources(); 2205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < bitmapResources.size(); i++) { 2215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = bitmapResources.itemAt(i); 2225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(resource); 22358ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 225d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 22649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources(); 22749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < ownedBitmapResources.size(); i++) { 22849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* resource = ownedBitmapResources.itemAt(i); 22949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy mOwnedBitmapResources.add(resource); 23058ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 23149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 23249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 23349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources(); 234d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < filterResources.size(); i++) { 235d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaColorFilter* resource = filterResources.itemAt(i); 236d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.add(resource); 23758ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 238d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 239d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 24049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkiaShader*>& shaders = recorder.getShaders(); 24124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < shaders.size(); i++) { 242d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaShader* resource = shaders.itemAt(i); 243d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mShaders.add(resource); 24458ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 24558ecc204fbcacef34806290492384677a330d4d4Romain Guy } 24658ecc204fbcacef34806290492384677a330d4d4Romain Guy 24758ecc204fbcacef34806290492384677a330d4d4Romain Guy const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths(); 24858ecc204fbcacef34806290492384677a330d4d4Romain Guy for (size_t i = 0; i < sourcePaths.size(); i++) { 24958ecc204fbcacef34806290492384677a330d4d4Romain Guy mSourcePaths.add(sourcePaths.itemAt(i)); 25058ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i)); 251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 253603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase const Vector<Layer*>& layers = recorder.getLayers(); 254603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < layers.size(); i++) { 255603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.add(layers.itemAt(i)); 256603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase caches.resourceCache.incrementRefcountLocked(layers.itemAt(i)); 257603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 258603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 25958ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.unlock(); 26058ecc204fbcacef34806290492384677a330d4d4Romain Guy 26149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkPaint*>& paints = recorder.getPaints(); 262d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < paints.size(); i++) { 263d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paints.itemAt(i)); 264d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 265d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 26649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkPath*>& paths = recorder.getPaths(); 2672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < paths.size(); i++) { 2682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.add(paths.itemAt(i)); 2692fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2702fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 27149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkMatrix*>& matrices = recorder.getMatrices(); 272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < matrices.size(); i++) { 273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.add(matrices.itemAt(i)); 274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 27865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = 0; 27904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = true; 280034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy mFunctorCount = 0; 2816a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mLeft = 0; 2826a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mTop = 0; 2836a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mRight = 0; 2846a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mBottom = 0; 2856a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mClipChildren = true; 2866a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mAlpha = 1; 2876a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mMultipliedAlpha = 255; 2886a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mHasOverlappingRendering = true; 2896a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mTranslationX = 0; 2906a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mTranslationY = 0; 2916a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mRotation = 0; 2926a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mRotationX = 0; 2936a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mRotationY= 0; 2946a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mScaleX = 1; 2956a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mScaleY = 1; 2966a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mPivotX = 0; 2976a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mPivotY = 0; 2986a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mCameraDistance = 0; 2996a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mMatrixDirty = false; 3006a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mMatrixFlags = 0; 3016a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mPrevWidth = -1; 3026a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mPrevHeight = -1; 3036a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mWidth = 0; 3046a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mHeight = 0; 3056a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mPivotExplicitlySet = false; 3066a2d17f71342f981c9df1dc5beff33e30eb3ae2bChet Haase mCaching = false; 30765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy} 30865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 30965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() { 31065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy return mSize; 311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the 315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function. 316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { 318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase TextContainer text; 319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t count = (level + 1) * 2; 321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase char indent[count + 1]; 322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase for (uint32_t i = 0; i < count; i++) { 323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[i] = ' '; 324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[count] = '\0'; 326ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this, 327ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy mName.string(), isRenderable()); 328ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 3291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int saveCount = renderer.getSaveCount() - 1; 331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase outputViewProperties(renderer, (char*) indent); 333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase mReader.rewind(); 334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase while (!mReader.eof()) { 336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int op = mReader.readInt(); 33733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 33833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int skip = mReader.readInt(); 33933f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%sSkip %d", (char*) indent, skip); 34033f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase switch (op) { 344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawGLFunction: { 345ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Functor *functor = (Functor *) getInt(); 3465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Save: { 350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int rendererNum = getInt(); 3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Restore: { 3555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case RestoreToCount: { 359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int restoreCount = saveCount + getInt(); 3605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayer: { 364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 3685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayerAlpha: { 375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int alpha = getInt(); 380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Translate: { 386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 3885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Rotate: { 392ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float rotation = getFloat(); 3935baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Scale: { 397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 3995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Skew: { 403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 4055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetMatrix: { 409ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 4105baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ConcatMatrix: { 414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 415a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s new concat %p: [%f, %f, %f] [%f, %f, %f] [%f, %f, %f]", 416a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1), 417a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5), 418a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ClipRect: { 422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int regionOp = getInt(); 4275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 428a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawDisplayList: { 432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase DisplayList* displayList = getDisplayList(); 43333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 43433f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 4351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase displayList, mWidth, mHeight, flags, level + 1); 436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase renderer.outputDisplayList(displayList, level + 1); 437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLayer: { 440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Layer* layer = (Layer*) getInt(); 441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 445a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmap: { 449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 454a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMatrix: { 458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 4605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 462a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapRect: { 466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f7 = getFloat(); 474ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f8 = getFloat(); 4755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 477a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 480e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy case DrawBitmapData: { 481e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkBitmap* bitmap = getBitmapData(); 482e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float x = getFloat(); 483e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float y = getFloat(); 484e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkPaint* paint = getPaint(renderer); 485e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint); 486e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 487e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy break; 488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMesh: { 489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int verticesCount = 0; 490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t colorsCount = 0; 491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshWidth = getInt(); 493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshHeight = getInt(); 494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* vertices = getFloats(verticesCount); 495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bool hasColors = getInt(); 496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int* colors = hasColors ? getInts(colorsCount) : NULL; 4975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPatch: { 502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* xDivs = NULL; 503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* yDivs = NULL; 504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t* colors = NULL; 505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t xDivsCount = 0; 506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t yDivsCount = 0; 507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int8_t numColors = 0; 508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase xDivs = getInts(xDivsCount); 510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase yDivs = getInts(yDivsCount); 511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase colors = getUInts(numColors); 512a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float left = getFloat(); 513a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float top = getFloat(); 514a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float right = getFloat(); 515a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float bottom = getFloat(); 516be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha = getInt(); 517be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode = (SkXfermode::Mode) getInt(); 5185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op], 519a62f172215727a1e00af0cb934904e00926a86c9Romain Guy left, top, right, bottom); 520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawColor: { 523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 524ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int xferMode = getInt(); 5255baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRect: { 529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 5335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 535a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRoundRect: { 539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 5455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 547a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawCircle: { 551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 553ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 5545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %p", 556a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 557ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 558ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawOval: { 560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 563ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 5645ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5655baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 566a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawArc: { 570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int i1 = getInt(); 5775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 579a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPath: { 583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkPath* path = getPath(); 5845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLines: { 589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPoints: { 596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 601ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 602325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 603325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 604325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 605325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 606325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 607325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 608325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 609325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 610325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 611325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 612325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 613eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 614eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 615eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int count = getInt(); 616eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int positionsCount = 0; 617eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 6185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 619eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase text.text(), text.length(), count, paint); 621eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 622996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 623c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy case DrawText: { 624996e57c84368058be793897ebc355b917a59abc2Raph Levien getText(&text); 62518edb81172daa9b98b53d226d94fc03249b1adedRomain Guy int32_t count = getInt(); 62618edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float x = getFloat(); 62718edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float y = getFloat(); 62818edb81172daa9b98b53d226d94fc03249b1adedRomain Guy int32_t positionsCount = 0; 629996e57c84368058be793897ebc355b917a59abc2Raph Levien float* positions = getFloats(positionsCount); 630996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPaint* paint = getPaint(renderer); 63118edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float length = getFloat(); 632996e57c84368058be793897ebc355b917a59abc2Raph Levien ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 633996e57c84368058be793897ebc355b917a59abc2Raph Levien text.text(), text.length(), count, paint); 634996e57c84368058be793897ebc355b917a59abc2Raph Levien } 635996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 636ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShader: { 6375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 639ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 640ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShader: { 641ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaShader* shader = getShader(); 6425baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 643ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 644ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 645ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetColorFilter: { 6465baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 648ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 649ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupColorFilter: { 650ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 6515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 652ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 653ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 654ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShadow: { 6555baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 656ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 657ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 658ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShadow: { 659ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float radius = getFloat(); 660ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dx = getFloat(); 661ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dy = getFloat(); 662ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 6635baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 665ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 666ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 6715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int clearBits = getInt(); 6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int setBits = getInt(); 6745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits); 6755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 677ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase default: 6785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("Display List error: op not handled: %s%s", 679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 680ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 681ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 682ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string()); 684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() { 687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixDirty) { 688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformMatrix) { 689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix = new SkMatrix(); 690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) { 692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mPivotExplicitlySet) { 695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mWidth != mPrevWidth || mHeight != mPrevHeight) { 696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevWidth = mWidth; 697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevHeight = mHeight; 698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = mPrevWidth / 2; 699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = mPrevHeight / 2; 700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if ((mMatrixFlags & ROTATION_3D) == 0) { 703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->setTranslate(mTranslationX, mTranslationY); 704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY); 705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformCamera) { 708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera = new Sk3DView(); 709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D = new SkMatrix(); 710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->save(); 713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateX(mRotationX); 715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateY(mRotationY); 716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateZ(-mRotation); 717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->getMatrix(mTransformMatrix3D); 718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY); 719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->postTranslate(mPivotX + mTranslationX, 720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY + mTranslationY); 721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->postConcat(*mTransformMatrix3D); 722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->restore(); 723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = false; 726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) { 7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase updateMatrix(); 7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mLeft != 0 || mTop != 0) { 7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mStaticMatrix) { 7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(8)); 7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAnimationMatrix) { 7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(8)); 7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags != 0) { 7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags == TRANSLATION) { 7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 7551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 7569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix", mTransformMatrix, 7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 7621271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(8)); 7639d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAlpha < 1 && !mCaching) { 7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // TODO: should be able to store the size of a DL at record time and not 7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // have to pass it into this call. In fact, this information might be in the 7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // location/size info that we store with the new native transform data. 7691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mClipChildren) { 7711271e2cc80b01d577e9db339459ef0222bb9320dChet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 7791271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) mRight - mLeft, (float) mBottom - mTop); 780a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 781a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 782ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 7831271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) { 784a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST 785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t count = (level + 1) * 2; 786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase char indent[count + 1]; 787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase for (uint32_t i = 0; i < count; i++) { 788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[i] = ' '; 789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 790a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[count] = '\0'; 791a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif 7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase updateMatrix(); 7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mLeft != 0 || mTop != 0) { 7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.translate(mLeft, mTop); 7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mStaticMatrix) { 7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD( 7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(8)); 8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mStaticMatrix); 8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else if (mAnimationMatrix) { 8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD( 8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(8)); 8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mAnimationMatrix); 8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags != 0) { 8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags == TRANSLATION) { 8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.translate(mTranslationX, mTranslationY); 8221271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 8239420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase DISPLAY_LIST_LOGD( 8249420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix", mTransformMatrix, 8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 8291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(8)); 8311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mTransformMatrix); 832a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 8331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAlpha < 1 && !mCaching) { 8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (!mHasOverlappingRendering) { 8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha); 8371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.setAlpha(mAlpha); 8381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 8391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // TODO: should be able to store the size of a DL at record time and not 8401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // have to pass it into this call. In fact, this information might be in the 8411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // location/size info that we store with the new native transform data. 8421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 8431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 8441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 8459d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 8461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 8471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 8481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 8491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop, 8501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 8519d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 8521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 8541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 8551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) mRight - mLeft, (float) mBottom - mTop); 8561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop, 8571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase SkRegion::kIntersect_Op); 858a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 859a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 860a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 861ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 862ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked 863ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the 864ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view. 865ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 8661271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) { 867486590963e2207d68eebd6944fec70d50d41116aChet Haase status_t drawGlStatus = DrawGlInfo::kStatusDone; 868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 869b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 870b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 871ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 872ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy uint32_t count = (level + 1) * 2; 873ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy char indent[count + 1]; 874ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy for (uint32_t i = 0; i < count; i++) { 875ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[i] = ' '; 876ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy } 877ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[count] = '\0'; 878a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase Rect* clipRect = renderer.getClipRect(); 879a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f", 880a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top, 881a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase clipRect->right, clipRect->bottom); 882ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 883b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 88413631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark(mName.string()); 8858a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 8861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 8871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save", 8881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo); 8891271e2cc80b01d577e9db339459ef0222bb9320dChet Haase setViewProperties(renderer, level); 8908a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 8918a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) { 892b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 893b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.restoreToCount(restoreTo); 894b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.endMark(); 895486590963e2207d68eebd6944fec70d50d41116aChet Haase return drawGlStatus; 896b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 89713631f3da855f200a151e7837ed9f6b079622b58Romain Guy 8989c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 899ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy int saveCount = renderer.getSaveCount() - 1; 9008a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 901b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 9025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int op = mReader.readInt(); 90333f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 904390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy int32_t skip = mReader.readInt(); 90533f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) { 90633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mReader.skip(skip); 90733f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent, 90833f6beb10f98e8ba96250e284876d607055d278dRomain Guy OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip); 90933f6beb10f98e8ba96250e284876d607055d278dRomain Guy continue; 91033f6beb10f98e8ba96250e284876d607055d278dRomain Guy } else { 91133f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 91233f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 91333f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 9149c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.writeCommand(level, op); 915ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 9168a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS 9178a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]); 9188a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif 9198a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 9205b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy switch (op) { 921daf98e941e140e8739458126640183b9f296a2abChet Haase case DrawGLFunction: { 922daf98e941e140e8739458126640183b9f296a2abChet Haase Functor *functor = (Functor *) getInt(); 923daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 92413631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark("GL functor"); 9256554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus |= renderer.callDrawGLFunction(functor, dirty); 92613631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 927daf98e941e140e8739458126640183b9f296a2abChet Haase } 928daf98e941e140e8739458126640183b9f296a2abChet Haase break; 929b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 93033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t rendererNum = getInt(); 931daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 932daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.save(rendererNum); 933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 935b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 936daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 940b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 94133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t restoreCount = saveCount + getInt(); 942daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 943daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.restoreToCount(restoreCount); 944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 946b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 947daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 948daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 949daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 950daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 9515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 95233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 953daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 954a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 955daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayer(f1, f2, f3, f4, paint, flags); 956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 957b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 9585b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy case SaveLayerAlpha: { 959daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 960daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 961daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 962daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 96333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t alpha = getInt(); 96433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 965daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 966a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 967daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); 9685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 9695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy break; 970b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 971daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 972daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 973daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 974daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.translate(f1, f2); 975b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 977b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 978daf98e941e140e8739458126640183b9f296a2abChet Haase float rotation = getFloat(); 979daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 980daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.rotate(rotation); 981b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 982b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 983b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 984daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 985daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 986daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 987daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.scale(sx, sy); 988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 989b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 990807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy case Skew: { 991daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 992daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 993daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 994daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.skew(sx, sy); 995807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy } 996807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy break; 997b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 998daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 999daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 1000daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setMatrix(matrix); 1001b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1002b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1003b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 1004daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 1005a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD( 1006a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 1007a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, 1008a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(0), matrix->get(1), matrix->get(2), 1009a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(3), matrix->get(4), matrix->get(5), 1010a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 1011daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.concatMatrix(matrix); 1012b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1013b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1014b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 1015daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1016daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1017daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1018daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 101933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t regionOp = getInt(); 1020daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 1021a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 1022daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); 1023b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1024b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 10250fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy case DrawDisplayList: { 1026daf98e941e140e8739458126640183b9f296a2abChet Haase DisplayList* displayList = getDisplayList(); 102733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 102833f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 10291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase displayList, mWidth, mHeight, flags, level + 1); 10301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1); 10310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 10320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy break; 10336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy case DrawLayer: { 1034d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase int oldAlpha = -1; 1035daf98e941e140e8739458126640183b9f296a2abChet Haase Layer* layer = (Layer*) getInt(); 1036daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 1037daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 10385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1039d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (mCaching && mMultipliedAlpha < 255) { 1040d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase oldAlpha = layer->getAlpha(); 1041d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase layer->setAlpha(mMultipliedAlpha); 1042a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 1043daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1044a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 1045486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawLayer(layer, x, y, paint); 1046d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (oldAlpha >= 0) { 1047d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase layer->setAlpha(oldAlpha); 1048d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 10496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 10506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy break; 1051b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 1052d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase int oldAlpha = -1; 1053daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1054daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 1055daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 10565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1057d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (mCaching && mMultipliedAlpha < 255) { 1058d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase oldAlpha = paint->getAlpha(); 1059b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase paint->setAlpha(mMultipliedAlpha); 1060b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 1061daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1062a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 1063486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint); 1064d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (oldAlpha >= 0) { 1065d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase paint->setAlpha(oldAlpha); 1066d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 1067b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1068b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1069b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 1070daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1071daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 10725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1073daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 1074a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 1075486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint); 1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1077b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1078b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 1079daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1080daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1081daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1082daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1083daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1084daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1085daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 1086daf98e941e140e8739458126640183b9f296a2abChet Haase float f7 = getFloat(); 1087daf98e941e140e8739458126640183b9f296a2abChet Haase float f8 = getFloat(); 10885ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1089daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1090a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, 1091a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, f5, f6, f7, f8,paint); 1092486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 1093b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1094b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1095e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy case DrawBitmapData: { 1096e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkBitmap* bitmap = getBitmapData(); 1097e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float x = getFloat(); 1098e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float y = getFloat(); 1099e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkPaint* paint = getPaint(renderer); 1100e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1101e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy bitmap, x, y, paint); 1102486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint); 1103e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 1104e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy break; 11055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy case DrawBitmapMesh: { 110633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t verticesCount = 0; 11075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t colorsCount = 0; 11085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 11095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy SkBitmap* bitmap = getBitmap(); 11105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshWidth = getInt(); 11115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshHeight = getInt(); 11125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices = getFloats(verticesCount); 11135a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy bool hasColors = getInt(); 111433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t* colors = hasColors ? getInts(colorsCount) : NULL; 11155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 11165a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 1117daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1118486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, 1119486590963e2207d68eebd6944fec70d50d41116aChet Haase colors, paint); 11205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 1121a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy break; 1122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 1123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 1124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 11254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 1127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 11284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 1129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 1131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 1133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 11344bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 1135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 11369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float left = getFloat(); 11379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float top = getFloat(); 11389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float right = getFloat(); 11399ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float bottom = getFloat(); 1140be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 1141be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha = getInt(); 1142be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode = (SkXfermode::Mode) getInt(); 11439ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy 1144daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1145486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors, 1146be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy xDivsCount, yDivsCount, numColors, left, top, right, bottom, 1147be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy alpha, mode); 1148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 115133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 115233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t xferMode = getInt(); 1153daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 1154486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode); 1155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 1158daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1159daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1160daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1161daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 11625ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1163daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1164a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 1165486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint); 1166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 116801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawRoundRect: { 1169daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1170daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1171daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1172daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1173daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1174daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 11755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1176daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 1178486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); 117901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 118001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 118101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawCircle: { 1182daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1183daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1184daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 11855ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1186daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", 1187a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 1188486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint); 118901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 119001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 1191c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy case DrawOval: { 1192daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1193daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1194daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1195daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 11965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1197daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 1198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 1199486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint); 1200c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy } 1201c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy break; 12028b2f5267f16c295f12faab810527cd6311997e34Romain Guy case DrawArc: { 1203daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1204daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1205daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1206daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1207daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1208daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 120933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t i1 = getInt(); 12105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1211daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 1212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 1213486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); 12148b2f5267f16c295f12faab810527cd6311997e34Romain Guy } 12158b2f5267f16c295f12faab810527cd6311997e34Romain Guy break; 1216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 1217daf98e941e140e8739458126640183b9f296a2abChet Haase SkPath* path = getPath(); 12185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1219daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 1220486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPath(path, paint); 1221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 122433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 12265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1227daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1228486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawLines(points, count, paint); 1229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1231ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy case DrawPoints: { 123233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1233ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy float* points = getFloats(count); 12345ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1235ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1236486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPoints(points, count, paint); 1237ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 1238ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy break; 1239325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 1240325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 1241325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 1242325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 1243325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 1244325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 1245325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 1246325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 1247325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 1248486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path, 1249325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy hOffset, vOffset, paint); 1250325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 1251325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 1252eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 1253eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 125433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 125533f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t positionsCount = 0; 1256eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 12575ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1258eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, 1259eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy OP_NAMES[op], text.text(), text.length(), count, paint); 1260486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count, 1261486590963e2207d68eebd6944fec70d50d41116aChet Haase positions, paint); 1262eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 1263eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy break; 1264c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy case DrawText: { 1265996e57c84368058be793897ebc355b917a59abc2Raph Levien getText(&text); 1266996e57c84368058be793897ebc355b917a59abc2Raph Levien int32_t count = getInt(); 1267996e57c84368058be793897ebc355b917a59abc2Raph Levien float x = getFloat(); 1268996e57c84368058be793897ebc355b917a59abc2Raph Levien float y = getFloat(); 1269996e57c84368058be793897ebc355b917a59abc2Raph Levien int32_t positionsCount = 0; 1270996e57c84368058be793897ebc355b917a59abc2Raph Levien float* positions = getFloats(positionsCount); 1271996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPaint* paint = getPaint(renderer); 1272996e57c84368058be793897ebc355b917a59abc2Raph Levien float length = getFloat(); 1273996e57c84368058be793897ebc355b917a59abc2Raph Levien DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, 1274996e57c84368058be793897ebc355b917a59abc2Raph Levien OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length); 1275c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy drawGlStatus |= renderer.drawText(text.text(), text.length(), count, 1276996e57c84368058be793897ebc355b917a59abc2Raph Levien x, y, positions, paint, length); 1277996e57c84368058be793897ebc355b917a59abc2Raph Levien } 1278996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 1279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 1280daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 1282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 1285daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaShader* shader = getShader(); 1286daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 1287daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShader(shader); 1288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1290b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 1291daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 1293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1295b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 1296daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 1297daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 1298daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupColorFilter(colorFilter); 1299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 1302daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 1304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 1307daf98e941e140e8739458126640183b9f296a2abChet Haase float radius = getFloat(); 1308daf98e941e140e8739458126640183b9f296a2abChet Haase float dx = getFloat(); 1309daf98e941e140e8739458126640183b9f296a2abChet Haase float dy = getFloat(); 131033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 1311daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 1312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 1313daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShadow(radius, dx, dy, color); 1314daf98e941e140e8739458126640183b9f296a2abChet Haase } 1315daf98e941e140e8739458126640183b9f296a2abChet Haase break; 13165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 13175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 13185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.resetPaintFilter(); 13195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 13205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 13215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 132233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t clearBits = getInt(); 132333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t setBits = getInt(); 13245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], 13255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy clearBits, setBits); 13265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.setupPaintFilter(clearBits, setBits); 13275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 13285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 1329daf98e941e140e8739458126640183b9f296a2abChet Haase default: 1330daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", 1331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 1332daf98e941e140e8739458126640183b9f296a2abChet Haase break; 1333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1335ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 13361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 13371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.restoreToCount(restoreTo); 133813631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 133913631f3da855f200a151e7837ed9f6b079622b58Romain Guy 1340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(), 13416554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus); 13426554943a1dd6854c0f4976900956e556767b49e1Romain Guy return drawGlStatus; 1343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 134958ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer(): 135058ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE), 135154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), 135254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mHasDrawOps(false), mFunctorCount(0) { 13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 13615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 136258ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.lock(); 136358ecc204fbcacef34806290492384677a330d4d4Romain Guy 13645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 136558ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i)); 13665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1367d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 136849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) { 136958ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i)); 137049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 137149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 1372d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 137358ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i)); 1374d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 1375d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 137643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 137758ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i)); 137843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy } 137943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy 1380d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase for (size_t i = 0; i < mSourcePaths.size(); i++) { 138158ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); 1382d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 138358ecc204fbcacef34806290492384677a330d4d4Romain Guy 1384603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < mLayers.size(); i++) { 1385603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); 1386603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 1387603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 138858ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.unlock(); 138958ecc204fbcacef34806290492384677a330d4d4Romain Guy 139058ecc204fbcacef34806290492384677a330d4d4Romain Guy mBitmapResources.clear(); 139158ecc204fbcacef34806290492384677a330d4d4Romain Guy mOwnedBitmapResources.clear(); 139258ecc204fbcacef34806290492384677a330d4d4Romain Guy mFilterResources.clear(); 1393d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.clear(); 1394d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 139558ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaders.clear(); 139658ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaderMap.clear(); 139758ecc204fbcacef34806290492384677a330d4d4Romain Guy 139843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaints.clear(); 139943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaintMap.clear(); 1400d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 14012fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 14022fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.clear(); 1403d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 1404d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 140504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 1406603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.clear(); 1407603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 140804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = false; 140954c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount = 0; 14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1416162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) { 1417162a0217563f4665da6eb183dfce0fef740f641fJeff Brown if (!displayList) { 1418162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList = new DisplayList(*this); 14195977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 1420162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList->initFromDisplayListRenderer(*this, true); 14215977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 142204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy displayList->setRenderable(mHasDrawOps); 1423162a0217563f4665da6eb183dfce0fef740f641fJeff Brown return displayList; 14245977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 14255977baa1fa24125c148a72699b53e62abaf08960Chet Haase 142649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() { 142749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy return true; 142849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy} 142949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 1430b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 1431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 1434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 1435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 14377c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guystatus_t DisplayListRenderer::prepareDirty(float left, float top, 14387d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy float right, float bottom, bool opaque) { 1439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 1440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 1441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 144245e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 1443b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 144445e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy mDirtyClip = opaque; 144545e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 144627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 144745e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 144844b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 144927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 145027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 145127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() { 145227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 145333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 1454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1456daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() { 1457daf98e941e140e8739458126640183b9f296a2abChet Haase} 1458daf98e941e140e8739458126640183b9f296a2abChet Haase 14592b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() { 14604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14626554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { 1463cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // Ignore dirty during recording, it matters only when we replay 1464daf98e941e140e8739458126640183b9f296a2abChet Haase addOp(DisplayList::DrawGLFunction); 1465daf98e941e140e8739458126640183b9f296a2abChet Haase addInt((int) functor); 146654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount++; 14676554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 1468daf98e941e140e8739458126640183b9f296a2abChet Haase} 1469daf98e941e140e8739458126640183b9f296a2abChet Haase 14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 1471b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 147704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 147833f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 147933f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 148004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 148133f6beb10f98e8ba96250e284876d607055d278dRomain Guy 148233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 148333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 148827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 148933f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 14945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 1495b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 14964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 14984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 1499b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 15035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 15045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addOp(DisplayList::SaveLayerAlpha); 15055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addBounds(left, top, right, bottom); 15065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(alpha); 15075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(flags); 15085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 15095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 15105b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 15114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 151233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = true; 151333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 151433f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 151533f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 1520b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 15214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 15234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 1526b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1531807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) { 1532807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addOp(DisplayList::Skew); 1533807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addPoint(sx, sy); 1534807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy OpenGLRenderer::skew(sx, sy); 1535807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 1536807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 15374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 1538b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 15414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 1544b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 15454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 15474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 15504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1551b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 15524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 15544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 15554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15576554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, 15581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase Rect& dirty, int32_t flags, uint32_t level) { 1559cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // dirty is an out parameter and should not be recorded, 1560cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // it matters only when replaying the display list 1561b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase 1562b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase addOp(DisplayList::DrawDisplayList); 15630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addDisplayList(displayList); 156433f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(flags); 15656554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; 15660fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 15670fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 1568486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { 15696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addOp(DisplayList::DrawLayer); 1570603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase addLayer(layer); 1571ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addPoint(x, y); 15726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addPaint(paint); 1573486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15746c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 15756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1576486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { 1577a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(left, top, 1578a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy left + bitmap->width(), top + bitmap->height()); 157933f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmap, reject); 15804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 15814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 15824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 158333f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1584486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1587486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) { 158833f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height()); 158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy const mat4 transform(*matrix); 159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy transform.mapRect(r); 159133f6beb10f98e8ba96250e284876d607055d278dRomain Guy 1592a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(r.left, r.top, r.right, r.bottom); 159333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject); 15944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 15954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 159733f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1598486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1601486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 16024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 16035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 1604a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(dstLeft, dstTop, dstRight, dstBottom); 160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject); 16064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 16074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 16084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 16094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1611486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1614486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, 1615486590963e2207d68eebd6944fec70d50d41116aChet Haase SkPaint* paint) { 1616a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(left, top, 1617a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy left + bitmap->width(), top + bitmap->height()); 1618e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapData, reject); 1619e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addBitmapData(bitmap); 1620e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addPoint(left, top); 1621e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addPaint(paint); 1622e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addSkip(location); 1623486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1624e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy} 1625e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 1626486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 16275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint) { 16285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addOp(DisplayList::DrawBitmapMesh); 16295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addBitmap(bitmap); 16305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshWidth); 16315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshHeight); 16325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2); 16335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) { 16345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(1); 16355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInts(colors, (meshWidth + 1) * (meshHeight + 1)); 16365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } else { 16375a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(0); 16385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 16395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addPaint(paint); 1640486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16415a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 16425a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 1643486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, 1644486590963e2207d68eebd6944fec70d50d41116aChet Haase const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height, 1645486590963e2207d68eebd6944fec70d50d41116aChet Haase int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) { 1646be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha; 1647be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode; 1648be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode); 1649be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 1650a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(left, top, right, bottom); 165133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPatch, reject); 16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 16554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 16564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 1657be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy addInt(alpha); 1658be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy addInt(mode); 165933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1660486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1663486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 1664b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 1667486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1670486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 16715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 167233f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 1673a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy quickRejectNoScissor(left, top, right, bottom); 167433f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRect, reject); 16754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 167733f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1678486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1681486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, 1682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float rx, float ry, SkPaint* paint) { 168333f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 1684a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy quickRejectNoScissor(left, top, right, bottom); 168533f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRoundRect, reject); 168601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addBounds(left, top, right, bottom); 168701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(rx, ry); 168801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 168933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1690486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 169101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 169201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1693486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { 169401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addOp(DisplayList::DrawCircle); 169501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(x, y); 169601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addFloat(radius); 169701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 1698486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 169901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 170001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1701486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom, 1702c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy SkPaint* paint) { 1703c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addOp(DisplayList::DrawOval); 1704c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addBounds(left, top, right, bottom); 1705c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addPaint(paint); 1706486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1707c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 1708c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 1709486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom, 17108b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { 171182d41a515368236e56454bd84023bebd6306f6b7Romain Guy addOp(DisplayList::DrawArc); 17128b2f5267f16c295f12faab810527cd6311997e34Romain Guy addBounds(left, top, right, bottom); 17138b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPoint(startAngle, sweepAngle); 17148b2f5267f16c295f12faab810527cd6311997e34Romain Guy addInt(useCenter ? 1 : 0); 17158b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPaint(paint); 1716486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17178b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 17188b2f5267f16c295f12faab810527cd6311997e34Romain Guy 1719486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 172033f6beb10f98e8ba96250e284876d607055d278dRomain Guy float left, top, offset; 172133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, height; 172233f6beb10f98e8ba96250e284876d607055d278dRomain Guy computePathBounds(path, paint, left, top, offset, width, height); 172333f6beb10f98e8ba96250e284876d607055d278dRomain Guy 172495c21d0546e36ade3e0601394f5b625541836545Romain Guy left -= offset; 172595c21d0546e36ade3e0601394f5b625541836545Romain Guy top -= offset; 172695c21d0546e36ade3e0601394f5b625541836545Romain Guy 1727a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy const bool reject = quickRejectNoScissor(left, top, left + width, top + height); 172833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPath, reject); 17294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 17304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 173133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1732486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 17344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1735486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 1736b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 17374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 17384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 1739486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1740ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 1741ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 1742486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { 1743ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addOp(DisplayList::DrawPoints); 1744ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addFloats(points, count); 1745ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addPaint(paint); 1746486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 17484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1749996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, 1750996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPath* path, float hOffset, float vOffset, SkPaint* paint) { 1751996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 1752996e57c84368058be793897ebc355b917a59abc2Raph Levien addOp(DisplayList::DrawTextOnPath); 1753996e57c84368058be793897ebc355b917a59abc2Raph Levien addText(text, bytesCount); 1754996e57c84368058be793897ebc355b917a59abc2Raph Levien addInt(count); 1755996e57c84368058be793897ebc355b917a59abc2Raph Levien addPath(path); 1756996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(hOffset); 1757996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(vOffset); 1758996e57c84368058be793897ebc355b917a59abc2Raph Levien paint->setAntiAlias(true); 1759e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1760e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1761e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1762996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 1763996e57c84368058be793897ebc355b917a59abc2Raph Levien} 1764996e57c84368058be793897ebc355b917a59abc2Raph Levien 1765996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, 1766996e57c84368058be793897ebc355b917a59abc2Raph Levien const float* positions, SkPaint* paint) { 1767996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 1768996e57c84368058be793897ebc355b917a59abc2Raph Levien addOp(DisplayList::DrawPosText); 1769996e57c84368058be793897ebc355b917a59abc2Raph Levien addText(text, bytesCount); 1770996e57c84368058be793897ebc355b917a59abc2Raph Levien addInt(count); 1771996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloats(positions, count * 2); 1772996e57c84368058be793897ebc355b917a59abc2Raph Levien paint->setAntiAlias(true); 1773e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1774e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1775e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1776996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 1777996e57c84368058be793897ebc355b917a59abc2Raph Levien} 1778996e57c84368058be793897ebc355b917a59abc2Raph Levien 1779c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 1780996e57c84368058be793897ebc355b917a59abc2Raph Levien float x, float y, const float* positions, SkPaint* paint, float length) { 1781486590963e2207d68eebd6944fec70d50d41116aChet Haase if (!text || count <= 0) return DrawGlInfo::kStatusDone; 178233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 17838f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // TODO: We should probably make a copy of the paint instead of modifying 17848f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // it; modifying the paint will change its generationID the first 17858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // time, which might impact caches. More investigation needed to 17868f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // see if it matters. 17878f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // If we make a copy, then drawTextDecorations() should *not* make 17888f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // its own copy as it does right now. 1789c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio // Beware: this needs Glyph encoding (already done on the Paint constructor) 17908f9a9f61ab793d9387a5942b307e74324704893bRomain Guy paint->setAntiAlias(true); 179133f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (length < 0.0f) length = paint->measureText(text, bytesCount); 179233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 179333f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool reject = false; 179433f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) { 179533f6beb10f98e8ba96250e284876d607055d278dRomain Guy SkPaint::FontMetrics metrics; 179633f6beb10f98e8ba96250e284876d607055d278dRomain Guy paint->getFontMetrics(&metrics, 0.0f); 1797a3dc55f83ab583e0a66b893c71b849afa046770aRomain Guy reject = quickRejectNoScissor(x, y + metrics.fTop, x + length, y + metrics.fBottom); 179833f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 179933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 1800c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy uint32_t* location = addOp(DisplayList::DrawText, reject); 180133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addText(text, bytesCount); 180233f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(count); 1803996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(x); 1804996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(y); 1805996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloats(positions, count * 2); 1806e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1807e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase if (!reject) { 1808e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1809e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1810e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase } 181133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addFloat(length); 181233f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1813486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1814eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 1815eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 18164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 1817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 18184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 18215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addOp(DisplayList::SetupShader); 18225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addShader(shader); 18234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 1826b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 18274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 1830ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addOp(DisplayList::SetupColorFilter); 1831ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addColorFilter(filter); 18324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 1835b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 18364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 1839b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 18404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 18414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 18424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 18434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() { 18465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::ResetPaintFilter); 18475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 18485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 18495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) { 18505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::SetupPaintFilter); 18515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(clearBits); 18525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(setBits); 18535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 18545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 18554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 18564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 1857