DisplayListRenderer.cpp revision 9420abd56a2af7ddbeb70562b79d61b2dca8c5a1
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/* 24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project 34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License. 64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at 74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software 114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and 144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License. 154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer" 184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h> 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h> 226554943a1dd6854c0f4976900956e556767b49e1Romain Guy 239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h" 2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = { 35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Save", 36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Restore", 37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "RestoreToCount", 38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayer", 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayerAlpha", 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Translate", 41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Rotate", 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Scale", 434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy "Skew", 44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetMatrix", 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ConcatMatrix", 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ClipRect", 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawDisplayList", 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLayer", 49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmap", 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapMatrix", 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapRect", 525a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy "DrawBitmapMesh", 53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPatch", 54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawColor", 55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawRect", 5601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawRoundRect", 5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawCircle", 58c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy "DrawOval", 598b2f5267f16c295f12faab810527cd6311997e34Romain Guy "DrawArc", 60ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPath", 61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLines", 62ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy "DrawPoints", 63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawText", 64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy "DrawTextOnPath", 65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy "DrawPosText", 66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShader", 67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupShader", 68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetColorFilter", 69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupColorFilter", 70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShadow", 71daf98e941e140e8739458126640183b9f296a2abChet Haase "SetupShadow", 725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "ResetPaintFilter", 735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "SetupPaintFilter", 74daf98e941e140e8739458126640183b9f296a2abChet Haase "DrawGLFunction" 75ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy}; 76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 779c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) { 789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (logBuffer.isEmpty()) { 809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase return; 819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 8265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 839c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase FILE *file = fdopen(fd, "a"); 8465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 859c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fprintf(file, "\nRecent DisplayList operations\n"); 869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.outputCommands(file, OP_NAMES); 8765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy String8 cachesLog; 8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy Caches::getInstance().dumpMemoryUsage(cachesLog); 9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\nCaches:\n%s", cachesLog.string()); 9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\n"); 9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 939c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fflush(file); 949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 96491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) : 979420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL), 989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix(NULL), mAnimationMatrix(NULL) { 99491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase 1005977baa1fa24125c148a72699b53e62abaf08960Chet Haase initFromDisplayListRenderer(recorder); 1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1035977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() { 104d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase} 106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() { 108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = 0; 109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = 0; 110b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase mRight = 0; 111a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = 0; 112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mClipChildren = true; 113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mAlpha = 1; 114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMultipliedAlpha = 255; 115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationX = 0; 116a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationY = 0; 117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotation = 0; 118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationX = 0; 119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationY= 0; 120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleX = 1; 121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleY = 1; 122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = 0; 123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = 0; 124b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase mCameraDistance = 0; 125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = false; 126a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags = 0; 127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevWidth = -1; 128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevHeight = -1; 129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = 0; 130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = 0; 131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = false; 132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCaching = false; 133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { 136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy if (displayList) { 137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy DISPLAY_LIST_LOGD("Deferring display list destruction"); 138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy Caches::getInstance().deleteDisplayListDeferred(displayList); 139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy } 140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy} 141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 142d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() { 1435977baa1fa24125c148a72699b53e62abaf08960Chet Haase sk_free((void*) mReader.base()); 1445977baa1fa24125c148a72699b53e62abaf08960Chet Haase 145866ed817d0adf5b874eff277b4a4d2bcc6f61830Chet Haase if (USE_DISPLAY_LIST_PROPERTIES) { 1469420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mTransformMatrix; 1479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mTransformCamera; 1489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mTransformMatrix3D; 1499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mStaticMatrix; 1509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase delete mAnimationMatrix; 1519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformMatrix = NULL; 1529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformCamera = NULL; 1539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformMatrix3D = NULL; 1549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix = NULL; 1559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix = NULL; 156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 157a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1585977baa1fa24125c148a72699b53e62abaf08960Chet Haase Caches& caches = Caches::getInstance(); 1595977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 1615977baa1fa24125c148a72699b53e62abaf08960Chet Haase caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); 1625977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase mBitmapResources.clear(); 1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase 165d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 166d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); 167d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 168d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.clear(); 169d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 17024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 17143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); 172d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.destructor(mShaders.itemAt(i)); 1735977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 17424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaders.clear(); 1755977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1765977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mPaints.size(); i++) { 1775977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mPaints.itemAt(i); 1785977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1795977baa1fa24125c148a72699b53e62abaf08960Chet Haase mPaints.clear(); 1805977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1812fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < mPaths.size(); i++) { 1821af23a32d879db330eb5a08b21090ec60b604a32Romain Guy SkPath* path = mPaths.itemAt(i); 1831af23a32d879db330eb5a08b21090ec60b604a32Romain Guy caches.pathCache.remove(path); 1841af23a32d879db330eb5a08b21090ec60b604a32Romain Guy delete path; 1852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 1885977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mMatrices.size(); i++) { 1895977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mMatrices.itemAt(i); 1905977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1915977baa1fa24125c148a72699b53e62abaf08960Chet Haase mMatrices.clear(); 1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase 194d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { 195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writer = recorder.writeStream(); 196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy init(); 197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy if (writer.size() == 0) { 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return; 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 202d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase if (reusing) { 203d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase // re-using display list - clear out previous allocations 204d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 205d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase } 206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase initProperties(); 207d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 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 2135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*> &bitmapResources = recorder.getBitmapResources(); 2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < bitmapResources.size(); i++) { 2175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = bitmapResources.itemAt(i); 2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(resource); 2195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase caches.resourceCache.incrementRefcount(resource); 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 221d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 222d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*> &filterResources = recorder.getFilterResources(); 223d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < filterResources.size(); i++) { 224d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaColorFilter* resource = filterResources.itemAt(i); 225d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.add(resource); 226d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.incrementRefcount(resource); 227d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 228d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 22924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*> &shaders = recorder.getShaders(); 23024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < shaders.size(); i++) { 231d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaShader* resource = shaders.itemAt(i); 232d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mShaders.add(resource); 233d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.incrementRefcount(resource); 234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*> &paints = recorder.getPaints(); 237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < paints.size(); i++) { 238d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paints.itemAt(i)); 239d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 240d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 2412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*> &paths = recorder.getPaths(); 2422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < paths.size(); i++) { 2432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.add(paths.itemAt(i)); 2442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 246d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*> &matrices = recorder.getMatrices(); 247d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < matrices.size(); i++) { 248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.add(matrices.itemAt(i)); 249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 25365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = 0; 25404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = true; 25565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy} 25665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 25765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() { 25865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy return mSize; 259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 261ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 262ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the 263ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function. 264ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 265ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { 266ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase TextContainer text; 267ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 268ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t count = (level + 1) * 2; 269ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase char indent[count + 1]; 270ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase for (uint32_t i = 0; i < count; i++) { 271ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[i] = ' '; 272ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 273ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[count] = '\0'; 27413631f3da855f200a151e7837ed9f6b079622b58Romain Guy ALOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string()); 275ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 276ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int saveCount = renderer.getSaveCount() - 1; 277ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase outputViewProperties(renderer, (char*) indent); 279ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase mReader.rewind(); 280ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 281ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase while (!mReader.eof()) { 282ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int op = mReader.readInt(); 28333f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 28433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int skip = mReader.readInt(); 28533f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%sSkip %d", (char*) indent, skip); 28633f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 288ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 289ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase switch (op) { 290ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawGLFunction: { 291ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Functor *functor = (Functor *) getInt(); 2925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 293ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 294ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 295ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Save: { 296ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int rendererNum = getInt(); 2975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 298ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 299ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 300ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Restore: { 3015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 302ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 303ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 304ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case RestoreToCount: { 305ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int restoreCount = saveCount + getInt(); 3065baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 307ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 308ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 309ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayer: { 310ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 311ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 3145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3165baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayerAlpha: { 321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 325ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int alpha = getInt(); 326ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 331ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Translate: { 332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 3345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 336ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 337ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Rotate: { 338ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float rotation = getFloat(); 3395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 340ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Scale: { 343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 3455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Skew: { 349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 350ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 3515baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 354ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetMatrix: { 355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 3565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 359ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ConcatMatrix: { 360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s new concat %p: [%f, %f, %f] [%f, %f, %f] [%f, %f, %f]", 362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1), 363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5), 364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 367ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ClipRect: { 368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 369ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 370ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int regionOp = getInt(); 3735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawDisplayList: { 378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase DisplayList* displayList = getDisplayList(); 379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t width = getUInt(); 380ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t height = getUInt(); 38133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 38233f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase displayList, width, height, flags, level + 1); 384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase renderer.outputDisplayList(displayList, level + 1); 385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 387ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLayer: { 388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Layer* layer = (Layer*) getInt(); 389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 3915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 3925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 393a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmap: { 397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 398ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4005ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 402a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 404ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMatrix: { 406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 4085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 410a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapRect: { 414ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 415ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 416ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 417ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f7 = getFloat(); 422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f8 = getFloat(); 4235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 425a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 426ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 427ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMesh: { 429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int verticesCount = 0; 430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t colorsCount = 0; 431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 432ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshWidth = getInt(); 433ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshHeight = getInt(); 434ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* vertices = getFloats(verticesCount); 435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bool hasColors = getInt(); 436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int* colors = hasColors ? getInts(colorsCount) : NULL; 4375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPatch: { 442ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* xDivs = NULL; 443ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* yDivs = NULL; 444ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t* colors = NULL; 445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t xDivsCount = 0; 446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t yDivsCount = 0; 447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int8_t numColors = 0; 448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase xDivs = getInts(xDivsCount); 450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase yDivs = getInts(yDivsCount); 451ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase colors = getUInts(numColors); 452a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float left = getFloat(); 453a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float top = getFloat(); 454a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float right = getFloat(); 455a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float bottom = getFloat(); 4565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4575baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op], 458a62f172215727a1e00af0cb934904e00926a86c9Romain Guy left, top, right, bottom); 459ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 460ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 461ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawColor: { 462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int xferMode = getInt(); 4645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRect: { 468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 4725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 474a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 475ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 476ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRoundRect: { 478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 479ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 480ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 481ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 482ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 483ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 4845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 486a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawCircle: { 490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 4935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4945baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %p", 495a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 496ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 497ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawOval: { 499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 5035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 505a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawArc: { 509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 511ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 512ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 513ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 514ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 515ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int i1 = getInt(); 5165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 518a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPath: { 522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkPath* path = getPath(); 5235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLines: { 528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 532ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 533ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 534ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPoints: { 535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawText: { 542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase getText(&text); 543325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 544ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 545ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 5465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 547cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float length = getFloat(); 5485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, OP_NAMES[op], 549a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase text.text(), text.length(), count, x, y, paint, length); 550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 552325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 553325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 554325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 555325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 556325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 557325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 558325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 559325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 560325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 561325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 562325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 563eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 564eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 565eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int count = getInt(); 566eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int positionsCount = 0; 567eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 5685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 569eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 570a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase text.text(), text.length(), count, paint); 571eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShader: { 5735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 576ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShader: { 577ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaShader* shader = getShader(); 5785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetColorFilter: { 5825baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 583ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 584ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupColorFilter: { 586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 5875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 590ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShadow: { 5915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShadow: { 595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float radius = getFloat(); 596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dx = getFloat(); 597ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dy = getFloat(); 598ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 5995baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 600a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 601ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 602ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 6035ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 6045ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 6055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int clearBits = getInt(); 6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int setBits = getInt(); 6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits); 6115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6125ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 613ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase default: 6145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("Display List error: op not handled: %s%s", 615a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 616ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 617ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 618ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 619a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string()); 620a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 621a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 622a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() { 623a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixDirty) { 624a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformMatrix) { 625a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix = new SkMatrix(); 626a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 627a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) { 628a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 629a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 630a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mPivotExplicitlySet) { 631a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mWidth != mPrevWidth || mHeight != mPrevHeight) { 632a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevWidth = mWidth; 633a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevHeight = mHeight; 634a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = mPrevWidth / 2; 635a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = mPrevHeight / 2; 636a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 637a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 638a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if ((mMatrixFlags & ROTATION_3D) == 0) { 639a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->setTranslate(mTranslationX, mTranslationY); 640a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY); 641a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 642a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 643a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformCamera) { 644a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera = new Sk3DView(); 645a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D = new SkMatrix(); 646a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 647a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 648a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->save(); 649a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 650a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateX(mRotationX); 651a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateY(mRotationY); 652a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateZ(-mRotation); 653a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->getMatrix(mTransformMatrix3D); 654a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY); 655a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->postTranslate(mPivotX + mTranslationX, 656a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY + mTranslationY); 657a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->postConcat(*mTransformMatrix3D); 658a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->restore(); 659a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 660a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 661a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = false; 662a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 664a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 665a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) { 666a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (USE_DISPLAY_LIST_PROPERTIES) { 667a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase updateMatrix(); 668a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mLeft != 0 || mTop != 0) { 6699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 6709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 6719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase if (mStaticMatrix) { 6729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 6739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 6749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 6759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 6769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 6779420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 6789420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(8)); 6799420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } 6809420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase if (mAnimationMatrix) { 6819420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 6829420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 6839420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 6849420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 6859420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 6869420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 6879420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(8)); 688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags != 0) { 690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags == TRANSLATION) { 691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent, "ConcatMatrix", mTransformMatrix, 695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(8)); 700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 702b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase if (mAlpha < 1 && !mCaching) { 7039d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // TODO: should be able to store the size of a DL at record time and not 7049d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // have to pass it into this call. In fact, this information might be in the 7059d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // location/size info that we store with the new native transform data. 7069d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 7079d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase if (mClipChildren) { 7089d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 7099d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 7109d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 7119d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 7129d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase mMultipliedAlpha, flags); 7139d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mClipChildren) { 715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (float) mRight - mLeft, (float) mBottom - mTop); 717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 720ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height, 722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t level) { 723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (USE_DISPLAY_LIST_PROPERTIES) { 724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST 725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t count = (level + 1) * 2; 726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase char indent[count + 1]; 727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase for (uint32_t i = 0; i < count; i++) { 728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[i] = ' '; 729a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 730a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[count] = '\0'; 731a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif 732a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase updateMatrix(); 733a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mLeft != 0 || mTop != 0) { 7349420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 735a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase renderer.translate(mLeft, mTop); 736a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 7379420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase if (mStaticMatrix) { 7389420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase DISPLAY_LIST_LOGD( 7399420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7409420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 7419420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 7429420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 7439420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 7449420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 7459420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix->get(8)); 7469420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase renderer.concatMatrix(mStaticMatrix); 7479420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase } else if (mAnimationMatrix) { 7489420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase DISPLAY_LIST_LOGD( 7499420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7509420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 7519420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 7529420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 7539420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 7549420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 7559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mAnimationMatrix->get(8)); 7569420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase renderer.concatMatrix(mAnimationMatrix); 757a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 758a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags != 0) { 759a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags == TRANSLATION) { 760a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 761a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase renderer.translate(mTranslationX, mTranslationY); 762a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 763a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD( 764a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 765a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent, "ConcatMatrix", mTransformMatrix, 766a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 767a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 768a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 770a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->get(8)); 771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase renderer.concatMatrix(mTransformMatrix); 772a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 773a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 7749d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase if (mAlpha < 1 && !mCaching) { 7759d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // TODO: should be able to store the size of a DL at record time and not 7769d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // have to pass it into this call. In fact, this information might be in the 7779d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase // location/size info that we store with the new native transform data. 7789d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 7799d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase if (mClipChildren) { 7809d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 7819d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 7829d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 7839d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 7849d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase mMultipliedAlpha, flags); 7859d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop, 7869d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase mMultipliedAlpha, flags); 7879d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mClipChildren) { 789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 790a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (float) mRight - mLeft, (float) mBottom - mTop); 791a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop, 792a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkRegion::kIntersect_Op); 793a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 794a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 795a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 796a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 797ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 798ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked 799ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the 800ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view. 801ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 8026554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayList::replay(OpenGLRenderer& renderer, uint32_t width, 803a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t height, Rect& dirty, int32_t flags, uint32_t level) { 8046554943a1dd6854c0f4976900956e556767b49e1Romain Guy status_t drawGlStatus = 0; 805b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 806b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 807b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 808ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 809ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy uint32_t count = (level + 1) * 2; 810ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy char indent[count + 1]; 811ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy for (uint32_t i = 0; i < count; i++) { 812ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[i] = ' '; 813ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy } 814ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[count] = '\0'; 81513631f3da855f200a151e7837ed9f6b079622b58Romain Guy DISPLAY_LIST_LOGD("%sStart display list (%p, %s)", (char*) indent + 2, this, mName.string()); 816ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 817b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 81813631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark(mName.string()); 819a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase int restoreTo = 0; 820a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (USE_DISPLAY_LIST_PROPERTIES) { 821a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%s%s %d", indent, "Save", 822a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 823a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 824a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 825a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase setViewProperties(renderer, width, height, level); 826b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase if (USE_DISPLAY_LIST_PROPERTIES && renderer.quickReject(0, 0, width, height)) { 827b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 828b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.restoreToCount(restoreTo); 829b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.endMark(); 830b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase return false; 831b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 83213631f3da855f200a151e7837ed9f6b079622b58Romain Guy 8339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 834ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy int saveCount = renderer.getSaveCount() - 1; 835b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 8365b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int op = mReader.readInt(); 83733f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 838390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy int32_t skip = mReader.readInt(); 83933f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) { 84033f6beb10f98e8ba96250e284876d607055d278dRomain Guy mReader.skip(skip); 84133f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent, 84233f6beb10f98e8ba96250e284876d607055d278dRomain Guy OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip); 84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy continue; 84433f6beb10f98e8ba96250e284876d607055d278dRomain Guy } else { 84533f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 84633f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 84733f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 8489c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.writeCommand(level, op); 849ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 8505b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy switch (op) { 851daf98e941e140e8739458126640183b9f296a2abChet Haase case DrawGLFunction: { 852daf98e941e140e8739458126640183b9f296a2abChet Haase Functor *functor = (Functor *) getInt(); 853daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 85413631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark("GL functor"); 8556554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus |= renderer.callDrawGLFunction(functor, dirty); 85613631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 857daf98e941e140e8739458126640183b9f296a2abChet Haase } 858daf98e941e140e8739458126640183b9f296a2abChet Haase break; 859b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 86033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t rendererNum = getInt(); 861daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 862daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.save(rendererNum); 863b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 864b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 865b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 866daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 869b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 870b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 87133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t restoreCount = saveCount + getInt(); 872daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 873daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.restoreToCount(restoreCount); 874b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 875b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 876b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 877daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 878daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 879daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 880daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 8815ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 88233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 883daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 884a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 885daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayer(f1, f2, f3, f4, paint, flags); 886b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 887b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 8885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy case SaveLayerAlpha: { 889daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 890daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 891daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 892daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 89333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t alpha = getInt(); 89433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 895daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 896a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 897daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); 8985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 8995b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy break; 900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 901daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 902daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 903daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 904daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.translate(f1, f2); 905b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 906b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 907b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 908daf98e941e140e8739458126640183b9f296a2abChet Haase float rotation = getFloat(); 909daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 910daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.rotate(rotation); 911b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 912b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 913b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 914daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 915daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 916daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 917daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.scale(sx, sy); 918b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 919b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 920807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy case Skew: { 921daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 922daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 923daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 924daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.skew(sx, sy); 925807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy } 926807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy break; 927b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 928daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 929daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 930daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setMatrix(matrix); 931b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 934daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 935a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD( 936a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 937a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, 938a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(0), matrix->get(1), matrix->get(2), 939a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(3), matrix->get(4), matrix->get(5), 940a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 941daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.concatMatrix(matrix); 942b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 945daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 946daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 947daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 948daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 94933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t regionOp = getInt(); 950daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 951a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 952daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); 953b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 954b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 9550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy case DrawDisplayList: { 956daf98e941e140e8739458126640183b9f296a2abChet Haase DisplayList* displayList = getDisplayList(); 9577b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy uint32_t width = getUInt(); 9587b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy uint32_t height = getUInt(); 95933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 96033f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 961a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase displayList, width, height, flags, level + 1); 9626554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus |= renderer.drawDisplayList(displayList, width, 963a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase height, dirty, flags, level + 1); 9640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 9650fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy break; 9666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy case DrawLayer: { 967daf98e941e140e8739458126640183b9f296a2abChet Haase Layer* layer = (Layer*) getInt(); 968daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 969daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 9705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 971a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mCaching && mMultipliedAlpha < 255) { 972a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase paint->setAlpha(mMultipliedAlpha); 973a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 974daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 975a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 976daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawLayer(layer, x, y, paint); 9776c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 9786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy break; 979b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 980daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 981daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 982daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 9835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 984b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase if (mCaching && mMultipliedAlpha < 255) { 985b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase paint->setAlpha(mMultipliedAlpha); 986b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 987daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 988a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 989daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, x, y, paint); 990b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 991b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 992b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 993daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 994daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 9955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 996daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 997a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 998daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, matrix, paint); 999b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1001b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 1002daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1003daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1004daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1005daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1006daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1007daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1008daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 1009daf98e941e140e8739458126640183b9f296a2abChet Haase float f7 = getFloat(); 1010daf98e941e140e8739458126640183b9f296a2abChet Haase float f8 = getFloat(); 10115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1012daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1013a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, 1014a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, f5, f6, f7, f8,paint); 1015daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 1016b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1017b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 10185a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy case DrawBitmapMesh: { 101933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t verticesCount = 0; 10205a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t colorsCount = 0; 10215a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 10225a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy SkBitmap* bitmap = getBitmap(); 10235a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshWidth = getInt(); 10245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshHeight = getInt(); 10255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices = getFloats(verticesCount); 10265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy bool hasColors = getInt(); 102733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t* colors = hasColors ? getInts(colorsCount) : NULL; 10285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 10295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 1030daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 10319ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint); 10325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 1033a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy break; 1034b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 1035b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 1036b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 10374bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 1038b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 1039b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 10404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 1041b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1042b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 1043b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1044b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 1045b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 10464bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 1047b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 10489ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float left = getFloat(); 10499ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float top = getFloat(); 10509ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float right = getFloat(); 10519ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float bottom = getFloat(); 10525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 10539ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy 1054daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 10554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount, 10569ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy numColors, left, top, right, bottom, paint); 1057b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1058b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1059b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 106033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 106133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t xferMode = getInt(); 1062daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 1063daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawColor(color, (SkXfermode::Mode) xferMode); 1064b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1065b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 1067daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1068daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1069daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1070daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 10715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1072daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1073a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 1074daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawRect(f1, f2, f3, f4, paint); 1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 107701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawRoundRect: { 1078daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1079daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1080daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1081daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1082daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1083daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 10845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1085daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1086a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 1087daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); 108801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 108901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 109001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawCircle: { 1091daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1092daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1093daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 10945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1095daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", 1096a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 1097daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawCircle(f1, f2, f3, paint); 109801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 109901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 1100c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy case DrawOval: { 1101daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1102daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1103daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1104daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 11055ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1106daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 1107a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 1108daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawOval(f1, f2, f3, f4, paint); 1109c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy } 1110c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy break; 11118b2f5267f16c295f12faab810527cd6311997e34Romain Guy case DrawArc: { 1112daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1113daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1114daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1115daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1116daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1117daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 111833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t i1 = getInt(); 11195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1120daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 1121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 1122daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); 11238b2f5267f16c295f12faab810527cd6311997e34Romain Guy } 11248b2f5267f16c295f12faab810527cd6311997e34Romain Guy break; 1125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 1126daf98e941e140e8739458126640183b9f296a2abChet Haase SkPath* path = getPath(); 11275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1128daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 1129daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.drawPath(path, paint); 1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 113333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 11355ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1136daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 11379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawLines(points, count, paint); 1138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1140ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy case DrawPoints: { 114133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1142ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy float* points = getFloats(count); 11435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1144ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 11459ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy renderer.drawPoints(points, count, paint); 1146ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 1147ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy break; 1148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawText: { 1149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy getText(&text); 115033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 1151daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 1152daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 11535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1154cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float length = getFloat(); 1155cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, 1156cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length); 1157cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy renderer.drawText(text.text(), text.length(), count, x, y, paint, length); 1158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1160325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 1161325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 1162325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 1163325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 1164325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 1165325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 1166325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 1167325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 1168325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 1169325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy renderer.drawTextOnPath(text.text(), text.length(), count, path, 1170325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy hOffset, vOffset, paint); 1171325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 1172325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 1173eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 1174eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 117533f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 117633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t positionsCount = 0; 1177eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 11785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1179eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, 1180eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy OP_NAMES[op], text.text(), text.length(), count, paint); 1181eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy renderer.drawPosText(text.text(), text.length(), count, positions, paint); 1182eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 1183eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy break; 1184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 1185daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 1187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 1190daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaShader* shader = getShader(); 1191daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 1192daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShader(shader); 1193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 1196daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 1198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 1201daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 1202daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 1203daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupColorFilter(colorFilter); 1204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 1207daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 1209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 1212daf98e941e140e8739458126640183b9f296a2abChet Haase float radius = getFloat(); 1213daf98e941e140e8739458126640183b9f296a2abChet Haase float dx = getFloat(); 1214daf98e941e140e8739458126640183b9f296a2abChet Haase float dy = getFloat(); 121533f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 1216daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 1217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 1218daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShadow(radius, dx, dy, color); 1219daf98e941e140e8739458126640183b9f296a2abChet Haase } 1220daf98e941e140e8739458126640183b9f296a2abChet Haase break; 12215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 12225ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 12235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.resetPaintFilter(); 12245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 12255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 12265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 122733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t clearBits = getInt(); 122833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t setBits = getInt(); 12295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], 12305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy clearBits, setBits); 12315ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.setupPaintFilter(clearBits, setBits); 12325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 12335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 1234daf98e941e140e8739458126640183b9f296a2abChet Haase default: 1235daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", 1236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 1237daf98e941e140e8739458126640183b9f296a2abChet Haase break; 1238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1240ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 1241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (USE_DISPLAY_LIST_PROPERTIES) { 1242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 1243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase renderer.restoreToCount(restoreTo); 1244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 124513631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 124613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 1247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(), 12486554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus); 12496554943a1dd6854c0f4976900956e556767b49e1Romain Guy return drawGlStatus; 1250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 12534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 12544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 12554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet HaaseDisplayListRenderer::DisplayListRenderer() : mWriter(MIN_WRITER_SIZE), 125733f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), mHasDrawOps(false) { 12584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 12614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 12624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 12654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 12665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 12675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 12685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 1269d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mBitmapResources.itemAt(i)); 12705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 12715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.clear(); 1272d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 1273d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 1274d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mFilterResources.itemAt(i)); 1275d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 1276d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.clear(); 1277d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 127843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 1279d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy caches.resourceCache.decrementRefcount(mShaders.itemAt(i)); 128043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy } 128124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaders.clear(); 128224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaderMap.clear(); 128343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy 128443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaints.clear(); 128543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaintMap.clear(); 1286d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 12872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 12882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.clear(); 1289d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 1290d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 129104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 129204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = false; 12934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 12944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 12954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 12964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 12974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 12984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1299162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) { 1300162a0217563f4665da6eb183dfce0fef740f641fJeff Brown if (!displayList) { 1301162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList = new DisplayList(*this); 13025977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 1303162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList->initFromDisplayListRenderer(*this, true); 13045977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 130504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy displayList->setRenderable(mHasDrawOps); 1306162a0217563f4665da6eb183dfce0fef740f641fJeff Brown return displayList; 13075977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 13085977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 1310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 1311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 1313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 1314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 13167d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guyvoid DisplayListRenderer::prepareDirty(float left, float top, 13177d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy float right, float bottom, bool opaque) { 1318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 1319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 1320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 1321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 132227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 132327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 132427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 132527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() { 132627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 132733f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 1328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1329b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1330daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() { 1331daf98e941e140e8739458126640183b9f296a2abChet Haase} 1332daf98e941e140e8739458126640183b9f296a2abChet Haase 13332b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() { 13344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13366554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { 1337cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // Ignore dirty during recording, it matters only when we replay 1338daf98e941e140e8739458126640183b9f296a2abChet Haase addOp(DisplayList::DrawGLFunction); 1339daf98e941e140e8739458126640183b9f296a2abChet Haase addInt((int) functor); 13406554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 1341daf98e941e140e8739458126640183b9f296a2abChet Haase} 1342daf98e941e140e8739458126640183b9f296a2abChet Haase 13434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 1344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 135004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 135133f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 135233f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 135304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 135433f6beb10f98e8ba96250e284876d607055d278dRomain Guy 135533f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 135633f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 136127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 136233f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 13634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 13644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 13675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 1368b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 13694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 13704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 13714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 1372b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 13734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 13765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 13775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addOp(DisplayList::SaveLayerAlpha); 13785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addBounds(left, top, right, bottom); 13795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(alpha); 13805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(flags); 13815b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 13825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 13835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 13844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 138533f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = true; 138633f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 138733f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 138833f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 13894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 13904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 1393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 13944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 13954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 13964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 1399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 14004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 14014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 14024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1404807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) { 1405807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addOp(DisplayList::Skew); 1406807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addPoint(sx, sy); 1407807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy OpenGLRenderer::skew(sx, sy); 1408807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 1409807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 1411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 1417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 14184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 14194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 14204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 14234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1424b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 14254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 14264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 14274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 14284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14306554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, 143133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, uint32_t height, Rect& dirty, int32_t flags, uint32_t level) { 1432cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // dirty is an out parameter and should not be recorded, 1433cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // it matters only when replaying the display list 1434b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase 1435b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase addOp(DisplayList::DrawDisplayList); 14360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addDisplayList(displayList); 14377b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy addSize(width, height); 143833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(flags); 14396554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; 14400fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 14410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 1442ada830f639591b99c3e40de22b07296c7932a33fRomain Guyvoid DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { 14436c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addOp(DisplayList::DrawLayer); 1444ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addInt((int) layer); 1445ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addPoint(x, y); 14466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addPaint(paint); 14476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 14486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 144933f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { 145033f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height()); 145133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmap, reject); 14524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 14534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 14544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 145533f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 14564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 145833f6beb10f98e8ba96250e284876d607055d278dRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) { 145933f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height()); 146033f6beb10f98e8ba96250e284876d607055d278dRomain Guy const mat4 transform(*matrix); 146133f6beb10f98e8ba96250e284876d607055d278dRomain Guy transform.mapRect(r); 146233f6beb10f98e8ba96250e284876d607055d278dRomain Guy 146333f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(r.left, r.top, r.right, r.bottom); 146433f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject); 14654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 14664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 14674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 146833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 14735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 147433f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom); 147533f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject); 14764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 14774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 14784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 14794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 148033f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 14814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guyvoid DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 14845a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint) { 14855a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addOp(DisplayList::DrawBitmapMesh); 14865a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addBitmap(bitmap); 14875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshWidth); 14885a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshHeight); 14895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2); 14905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) { 14915a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(1); 14925a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInts(colors, (meshWidth + 1) * (meshHeight + 1)); 14935a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } else { 14945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(0); 14955a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 14965a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addPaint(paint); 14975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 14985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 15004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 15015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint) { 150233f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, right, bottom); 150333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPatch, reject); 15044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 15054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 15064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 15074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 15084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 15094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 151033f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 15114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 1514b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 15205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 152133f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 152233f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 152333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRect, reject); 15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 15254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 152633f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 152901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, 1530a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float rx, float ry, SkPaint* paint) { 153133f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 153233f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 153333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRoundRect, reject); 153401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addBounds(left, top, right, bottom); 153501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(rx, ry); 153601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 153733f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 153801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 153901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 154001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guyvoid DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { 154101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addOp(DisplayList::DrawCircle); 154201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(x, y); 154301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addFloat(radius); 154401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 154501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 154601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1547c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guyvoid DisplayListRenderer::drawOval(float left, float top, float right, float bottom, 1548c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy SkPaint* paint) { 1549c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addOp(DisplayList::DrawOval); 1550c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addBounds(left, top, right, bottom); 1551c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addPaint(paint); 1552c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 1553c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 15548b2f5267f16c295f12faab810527cd6311997e34Romain Guyvoid DisplayListRenderer::drawArc(float left, float top, float right, float bottom, 15558b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { 155682d41a515368236e56454bd84023bebd6306f6b7Romain Guy addOp(DisplayList::DrawArc); 15578b2f5267f16c295f12faab810527cd6311997e34Romain Guy addBounds(left, top, right, bottom); 15588b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPoint(startAngle, sweepAngle); 15598b2f5267f16c295f12faab810527cd6311997e34Romain Guy addInt(useCenter ? 1 : 0); 15608b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPaint(paint); 15618b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 15628b2f5267f16c295f12faab810527cd6311997e34Romain Guy 15634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 156433f6beb10f98e8ba96250e284876d607055d278dRomain Guy float left, top, offset; 156533f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, height; 156633f6beb10f98e8ba96250e284876d607055d278dRomain Guy computePathBounds(path, paint, left, top, offset, width, height); 156733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 156833f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left - offset, top - offset, width, height); 156933f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPath, reject); 15704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 15714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 157233f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 15734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15755c13d89c1332fcc499379b9064b891187b75ca32Chet Haasevoid DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 1576b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 15774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 1579ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 1580ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 1581ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guyvoid DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { 1582ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addOp(DisplayList::DrawPoints); 1583ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addFloats(points, count); 1584ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addPaint(paint); 15854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 1588cac5fd3e09e9dc918753d4aff624bf29a367ade3Romain Guy float x, float y, SkPaint* paint, float length) { 158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (!text || count <= 0) return; 159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 15918f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // TODO: We should probably make a copy of the paint instead of modifying 15928f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // it; modifying the paint will change its generationID the first 15938f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // time, which might impact caches. More investigation needed to 15948f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // see if it matters. 15958f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // If we make a copy, then drawTextDecorations() should *not* make 15968f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // its own copy as it does right now. 1597c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio // Beware: this needs Glyph encoding (already done on the Paint constructor) 15988f9a9f61ab793d9387a5942b307e74324704893bRomain Guy paint->setAntiAlias(true); 159933f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (length < 0.0f) length = paint->measureText(text, bytesCount); 160033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 160133f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool reject = false; 160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) { 160333f6beb10f98e8ba96250e284876d607055d278dRomain Guy SkPaint::FontMetrics metrics; 160433f6beb10f98e8ba96250e284876d607055d278dRomain Guy paint->getFontMetrics(&metrics, 0.0f); 160533f6beb10f98e8ba96250e284876d607055d278dRomain Guy reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom); 160633f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 160733f6beb10f98e8ba96250e284876d607055d278dRomain Guy 160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawText, reject); 160933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addText(text, bytesCount); 161033f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(count); 161133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addPoint(x, y); 16124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 161333f6beb10f98e8ba96250e284876d607055d278dRomain Guy addFloat(length); 161433f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 16154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1617325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guyvoid DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, 1618325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path, float hOffset, float vOffset, SkPaint* paint) { 1619325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy if (!text || count <= 0) return; 1620325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addOp(DisplayList::DrawTextOnPath); 1621325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addText(text, bytesCount); 1622325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addInt(count); 1623325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addPath(path); 1624325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addFloat(hOffset); 1625325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addFloat(vOffset); 1626325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy paint->setAntiAlias(true); 1627325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy addPaint(paint); 1628325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy} 1629325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy 1630eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guyvoid DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, 1631eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy const float* positions, SkPaint* paint) { 163233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (!text || count <= 0) return; 1633eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addOp(DisplayList::DrawPosText); 1634eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addText(text, bytesCount); 1635eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addInt(count); 1636eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addFloats(positions, count * 2); 1637eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy paint->setAntiAlias(true); 1638eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy addPaint(paint); 1639eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 1640eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 16414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 1642b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 16434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 16465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addOp(DisplayList::SetupShader); 16475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addShader(shader); 16484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 1651b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 16524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 1655ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addOp(DisplayList::SetupColorFilter); 1656ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addColorFilter(filter); 16574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 1660b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 16614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 1664b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 16674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 16684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 16705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() { 16715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::ResetPaintFilter); 16725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 16735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 16745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) { 16755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::SetupPaintFilter); 16765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(clearBits); 16775ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(setBits); 16785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 16795ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 16804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 16814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 1682