DisplayListRenderer.cpp revision 034de6b1ec561797a2422314e6ef03e3cd3e08e0
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/* 24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project 34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License. 64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at 74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * http://www.apache.org/licenses/LICENSE-2.0 94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * 104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software 114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS, 124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and 144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License. 154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define LOG_TAG "OpenGLRenderer" 184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 19d5a85fb63d91a9297e8d9a11016f3b3ed60dfbabRomain Guy#include <SkCamera.h> 209c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 216554943a1dd6854c0f4976900956e556767b49e1Romain Guy#include <private/hwui/DrawGlInfo.h> 226554943a1dd6854c0f4976900956e556767b49e1Romain Guy 239c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "DisplayListRenderer.h" 259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "Caches.h" 2613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 31b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 32b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 33b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 34ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guyconst char* DisplayList::OP_NAMES[] = { 35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Save", 36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Restore", 37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "RestoreToCount", 38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayer", 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SaveLayerAlpha", 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Translate", 41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Rotate", 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "Scale", 434cf6e2f34994f160e1baba205a43c12784dd3e0dRomain Guy "Skew", 44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetMatrix", 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ConcatMatrix", 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ClipRect", 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawDisplayList", 48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLayer", 49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmap", 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapMatrix", 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawBitmapRect", 52e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy "DrawBitmapData", 535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy "DrawBitmapMesh", 54ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPatch", 55ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawColor", 56ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawRect", 5701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawRoundRect", 5801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy "DrawCircle", 59c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy "DrawOval", 608b2f5267f16c295f12faab810527cd6311997e34Romain Guy "DrawArc", 61ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawPath", 62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "DrawLines", 63ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy "DrawPoints", 64325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy "DrawTextOnPath", 65eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy "DrawPosText", 66c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy "DrawText", 67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShader", 68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupShader", 69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetColorFilter", 70ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "SetupColorFilter", 71ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy "ResetShadow", 72daf98e941e140e8739458126640183b9f296a2abChet Haase "SetupShadow", 735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "ResetPaintFilter", 745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy "SetupPaintFilter", 75daf98e941e140e8739458126640183b9f296a2abChet Haase "DrawGLFunction" 76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy}; 77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 789c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haasevoid DisplayList::outputLogBuffer(int fd) { 799c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 809c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase if (logBuffer.isEmpty()) { 819c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase return; 829c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase } 8365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 849c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase FILE *file = fdopen(fd, "a"); 8565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 869c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fprintf(file, "\nRecent DisplayList operations\n"); 879c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.outputCommands(file, OP_NAMES); 8865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 8965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy String8 cachesLog; 9065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy Caches::getInstance().dumpMemoryUsage(cachesLog); 9165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\nCaches:\n%s", cachesLog.string()); 9265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy fprintf(file, "\n"); 9365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 949c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase fflush(file); 959c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase} 969c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 97491189f6bb81827a0c8e343f89420a9bcd2e62aeChet HaaseDisplayList::DisplayList(const DisplayListRenderer& recorder) : 989420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mTransformMatrix(NULL), mTransformCamera(NULL), mTransformMatrix3D(NULL), 999420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase mStaticMatrix(NULL), mAnimationMatrix(NULL) { 100491189f6bb81827a0c8e343f89420a9bcd2e62aeChet Haase 1015977baa1fa24125c148a72699b53e62abaf08960Chet Haase initFromDisplayListRenderer(recorder); 1025977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 1035977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1045977baa1fa24125c148a72699b53e62abaf08960Chet HaaseDisplayList::~DisplayList() { 105d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase} 107d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 108a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::initProperties() { 109a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mLeft = 0; 110a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTop = 0; 111b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase mRight = 0; 112a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mBottom = 0; 113a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mClipChildren = true; 114a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mAlpha = 1; 115a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMultipliedAlpha = 255; 116db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase mHasOverlappingRendering = true; 117a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationX = 0; 118a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTranslationY = 0; 119a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotation = 0; 120a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationX = 0; 121a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mRotationY= 0; 122a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleX = 1; 123a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mScaleY = 1; 124a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = 0; 125a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = 0; 126b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase mCameraDistance = 0; 127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = false; 128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixFlags = 0; 129a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevWidth = -1; 130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevHeight = -1; 131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mWidth = 0; 132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mHeight = 0; 133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotExplicitlySet = false; 134a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mCaching = false; 135a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 136a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guyvoid DisplayList::destroyDisplayListDeferred(DisplayList* displayList) { 138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy if (displayList) { 139bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy DISPLAY_LIST_LOGD("Deferring display list destruction"); 140bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy Caches::getInstance().deleteDisplayListDeferred(displayList); 141bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy } 142bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy} 143bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy 144d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::clearResources() { 1455977baa1fa24125c148a72699b53e62abaf08960Chet Haase sk_free((void*) mReader.base()); 146034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy mReader.setMemory(NULL, 0); 1475977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformMatrix; 1491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformCamera; 1501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mTransformMatrix3D; 1511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mStaticMatrix; 1521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase delete mAnimationMatrix; 15358ecc204fbcacef34806290492384677a330d4d4Romain Guy 1541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix = NULL; 1551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformCamera = NULL; 1561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix3D = NULL; 1571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix = NULL; 1581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix = NULL; 159a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 1605977baa1fa24125c148a72699b53e62abaf08960Chet Haase Caches& caches = Caches::getInstance(); 16154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy caches.unregisterFunctors(mFunctorCount); 16258ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.lock(); 1635977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1645977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 16558ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i)); 1665977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1675977baa1fa24125c148a72699b53e62abaf08960Chet Haase 16849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) { 16949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* bitmap = mOwnedBitmapResources.itemAt(i); 17058ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(bitmap); 17158ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.destructorLocked(bitmap); 17249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 17349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 174d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 17558ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i)); 176d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 177d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 17824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 17958ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i)); 18058ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.destructorLocked(mShaders.itemAt(i)); 1815977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 18258ecc204fbcacef34806290492384677a330d4d4Romain Guy 18358ecc204fbcacef34806290492384677a330d4d4Romain Guy for (size_t i = 0; i < mSourcePaths.size(); i++) { 18458ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); 18558ecc204fbcacef34806290492384677a330d4d4Romain Guy } 18658ecc204fbcacef34806290492384677a330d4d4Romain Guy 187603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < mLayers.size(); i++) { 188603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase caches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); 189603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 190603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 19158ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.unlock(); 1925977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1935977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mPaints.size(); i++) { 1945977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mPaints.itemAt(i); 1955977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 1965977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < mPaths.size(); i++) { 1981af23a32d879db330eb5a08b21090ec60b604a32Romain Guy SkPath* path = mPaths.itemAt(i); 1991af23a32d879db330eb5a08b21090ec60b604a32Romain Guy caches.pathCache.remove(path); 2001af23a32d879db330eb5a08b21090ec60b604a32Romain Guy delete path; 2012fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 202d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 2035977baa1fa24125c148a72699b53e62abaf08960Chet Haase for (size_t i = 0; i < mMatrices.size(); i++) { 2045977baa1fa24125c148a72699b53e62abaf08960Chet Haase delete mMatrices.itemAt(i); 2055977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 20658ecc204fbcacef34806290492384677a330d4d4Romain Guy 20758ecc204fbcacef34806290492384677a330d4d4Romain Guy mBitmapResources.clear(); 20858ecc204fbcacef34806290492384677a330d4d4Romain Guy mOwnedBitmapResources.clear(); 20958ecc204fbcacef34806290492384677a330d4d4Romain Guy mFilterResources.clear(); 21058ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaders.clear(); 21158ecc204fbcacef34806290492384677a330d4d4Romain Guy mSourcePaths.clear(); 21258ecc204fbcacef34806290492384677a330d4d4Romain Guy mPaints.clear(); 21358ecc204fbcacef34806290492384677a330d4d4Romain Guy mPaths.clear(); 2145977baa1fa24125c148a72699b53e62abaf08960Chet Haase mMatrices.clear(); 215603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.clear(); 2165977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 2175977baa1fa24125c148a72699b53e62abaf08960Chet Haase 218d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haasevoid DisplayList::initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing) { 219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writer = recorder.writeStream(); 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 221d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase if (reusing) { 222d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase // re-using display list - clear out previous allocations 223d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase clearResources(); 224d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase } 225034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy 226034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy init(); 227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase initProperties(); 228d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 229034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy if (writer.size() == 0) { 230034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy return; 231034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy } 232034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy 23365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = writer.size(); 23465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy void* buffer = sk_malloc_throw(mSize); 235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy writer.flatten(buffer); 23665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mReader.setMemory(buffer, mSize); 237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 23854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount = recorder.getFunctorCount(); 23954c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 2405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Caches& caches = Caches::getInstance(); 24154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy caches.registerFunctors(mFunctorCount); 24258ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.lock(); 243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 24449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkBitmap*>& bitmapResources = recorder.getBitmapResources(); 2455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < bitmapResources.size(); i++) { 2465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkBitmap* resource = bitmapResources.itemAt(i); 2475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(resource); 24858ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 250d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 25149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkBitmap*> &ownedBitmapResources = recorder.getOwnedBitmapResources(); 25249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < ownedBitmapResources.size(); i++) { 25349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy SkBitmap* resource = ownedBitmapResources.itemAt(i); 25449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy mOwnedBitmapResources.add(resource); 25558ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 25649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 25749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 25849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkiaColorFilter*>& filterResources = recorder.getFilterResources(); 259d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < filterResources.size(); i++) { 260d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaColorFilter* resource = filterResources.itemAt(i); 261d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mFilterResources.add(resource); 26258ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 263d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 264d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 26549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkiaShader*>& shaders = recorder.getShaders(); 26624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy for (size_t i = 0; i < shaders.size(); i++) { 267d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy SkiaShader* resource = shaders.itemAt(i); 268d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy mShaders.add(resource); 26958ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(resource); 27058ecc204fbcacef34806290492384677a330d4d4Romain Guy } 27158ecc204fbcacef34806290492384677a330d4d4Romain Guy 27258ecc204fbcacef34806290492384677a330d4d4Romain Guy const SortedVector<SkPath*>& sourcePaths = recorder.getSourcePaths(); 27358ecc204fbcacef34806290492384677a330d4d4Romain Guy for (size_t i = 0; i < sourcePaths.size(); i++) { 27458ecc204fbcacef34806290492384677a330d4d4Romain Guy mSourcePaths.add(sourcePaths.itemAt(i)); 27558ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.incrementRefcountLocked(sourcePaths.itemAt(i)); 276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 278603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase const Vector<Layer*>& layers = recorder.getLayers(); 279603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < layers.size(); i++) { 280603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.add(layers.itemAt(i)); 281603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase caches.resourceCache.incrementRefcountLocked(layers.itemAt(i)); 282603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 283603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 28458ecc204fbcacef34806290492384677a330d4d4Romain Guy caches.resourceCache.unlock(); 28558ecc204fbcacef34806290492384677a330d4d4Romain Guy 28649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkPaint*>& paints = recorder.getPaints(); 287d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < paints.size(); i++) { 288d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paints.itemAt(i)); 289d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 290d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 29149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkPath*>& paths = recorder.getPaths(); 2922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy for (size_t i = 0; i < paths.size(); i++) { 2932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.add(paths.itemAt(i)); 2942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 2952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 29649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkMatrix*>& matrices = recorder.getMatrices(); 297d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase for (size_t i = 0; i < matrices.size(); i++) { 298d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.add(matrices.itemAt(i)); 299d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 301b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayList::init() { 30365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy mSize = 0; 30404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = true; 305034de6b1ec561797a2422314e6ef03e3cd3e08e0Romain Guy mFunctorCount = 0; 30665b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy} 30765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 30865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guysize_t DisplayList::getSize() { 30965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy return mSize; 310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 312ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 313ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * This function is a simplified version of replay(), where we simply retrieve and log the 314ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * display list. This function should remain in sync with the replay() function. 315ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 316ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haasevoid DisplayList::output(OpenGLRenderer& renderer, uint32_t level) { 317ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase TextContainer text; 318ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 319ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t count = (level + 1) * 2; 320ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase char indent[count + 1]; 321ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase for (uint32_t i = 0; i < count; i++) { 322ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[i] = ' '; 323ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 324ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase indent[count] = '\0'; 325ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy ALOGD("%sStart display list (%p, %s, render=%d)", (char*) indent + 2, this, 326ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy mName.string(), isRenderable()); 327ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 3281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %d", indent, "Save", SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 329ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int saveCount = renderer.getSaveCount() - 1; 330ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase outputViewProperties(renderer, (char*) indent); 332ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase mReader.rewind(); 333ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 334ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase while (!mReader.eof()) { 335ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int op = mReader.readInt(); 33633f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 33733f6beb10f98e8ba96250e284876d607055d278dRomain Guy int skip = mReader.readInt(); 33833f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%sSkip %d", (char*) indent, skip); 33933f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 341ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 342ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase switch (op) { 343ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawGLFunction: { 344ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Functor *functor = (Functor *) getInt(); 3455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 346ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 347ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 348ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Save: { 349ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int rendererNum = getInt(); 3505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 351ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 352ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 353ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Restore: { 3545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 355ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 356ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 357ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case RestoreToCount: { 358ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int restoreCount = saveCount + getInt(); 3595baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 360ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 361ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 362ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayer: { 363ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 364ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 365ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 366ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 3675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 368ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 371ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 372ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 373ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SaveLayerAlpha: { 374ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 375ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 376ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 377ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 378ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int alpha = getInt(); 379ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int flags = getInt(); 3805baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 382ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 383ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 384ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Translate: { 385ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 386ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 3875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 388ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 389ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 390ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Rotate: { 391ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float rotation = getFloat(); 3925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 393ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 394ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 395ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Scale: { 396ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 397ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 3985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 399ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 400ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 401ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case Skew: { 402ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sx = getFloat(); 403ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float sy = getFloat(); 4045baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 405ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 406ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 407ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetMatrix: { 408ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 4095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 410ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 411ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 412ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ConcatMatrix: { 413ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 414a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%s%s new concat %p: [%f, %f, %f] [%f, %f, %f] [%f, %f, %f]", 415a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, matrix->get(0), matrix->get(1), 416a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(2), matrix->get(3), matrix->get(4), matrix->get(5), 417a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 418ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 419ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 420ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ClipRect: { 421ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 422ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 423ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 424ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 425ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int regionOp = getInt(); 4265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 427a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 428ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 429ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 430ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawDisplayList: { 431ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase DisplayList* displayList = getDisplayList(); 43233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 43333f6beb10f98e8ba96250e284876d607055d278dRomain Guy ALOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 4341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase displayList, mWidth, mHeight, flags, level + 1); 435ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase renderer.outputDisplayList(displayList, level + 1); 436ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 437ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 438ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLayer: { 439ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase Layer* layer = (Layer*) getInt(); 440ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 441ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 444a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 445ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 446ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 447ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmap: { 448ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 449ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float x = getFloat(); 450ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float y = getFloat(); 4515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4525baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 453a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 454ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 455ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 456ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMatrix: { 457ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 458ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkMatrix* matrix = getMatrix(); 4595ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4605baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 461a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 462ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 463ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 464ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapRect: { 465ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 466ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 467ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 468ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 469ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 470ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 471ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 472ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f7 = getFloat(); 473ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f8 = getFloat(); 4745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 476a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 477ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 478ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 479e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy case DrawBitmapData: { 480e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkBitmap* bitmap = getBitmapData(); 481e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float x = getFloat(); 482e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float y = getFloat(); 483e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkPaint* paint = getPaint(renderer); 484e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy ALOGD("%s%s %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], x, y, paint); 485e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 486e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy break; 487ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawBitmapMesh: { 488ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int verticesCount = 0; 489ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t colorsCount = 0; 490ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 491ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshWidth = getInt(); 492ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t meshHeight = getInt(); 493ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* vertices = getFloats(verticesCount); 494ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase bool hasColors = getInt(); 495ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int* colors = hasColors ? getInts(colorsCount) : NULL; 4965ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 4975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 498ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 499ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 500ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPatch: { 501ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* xDivs = NULL; 502ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int32_t* yDivs = NULL; 503ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t* colors = NULL; 504ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t xDivsCount = 0; 505ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase uint32_t yDivsCount = 0; 506ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int8_t numColors = 0; 507ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkBitmap* bitmap = getBitmap(); 508ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase xDivs = getInts(xDivsCount); 509ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase yDivs = getInts(yDivsCount); 510ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase colors = getUInts(numColors); 511a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float left = getFloat(); 512a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float top = getFloat(); 513a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float right = getFloat(); 514a62f172215727a1e00af0cb934904e00926a86c9Romain Guy float bottom = getFloat(); 515be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha = getInt(); 516be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode = (SkXfermode::Mode) getInt(); 5175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", (char*) indent, OP_NAMES[op], 518a62f172215727a1e00af0cb934904e00926a86c9Romain Guy left, top, right, bottom); 519ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 520ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 521ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawColor: { 522ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 523ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int xferMode = getInt(); 5245baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 525ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 526ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 527ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRect: { 528ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 529ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 530ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 531ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 5325ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5335baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 534a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 535ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 536ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 537ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawRoundRect: { 538ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 539ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 540ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 541ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 542ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 543ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 5445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 546a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 547ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 548ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 549ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawCircle: { 550ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 551ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 552ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 5535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %p", 555a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 556ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 557ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 558ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawOval: { 559ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 560ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 561ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 562ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 5635ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5645baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 565a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 566ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 567ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 568ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawArc: { 569ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f1 = getFloat(); 570ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f2 = getFloat(); 571ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f3 = getFloat(); 572ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f4 = getFloat(); 573ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f5 = getFloat(); 574ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float f6 = getFloat(); 575ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int i1 = getInt(); 5765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 578a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 579ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 580ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 581ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPath: { 582ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkPath* path = getPath(); 5835ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5845baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 585ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 586ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 587ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawLines: { 588ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 589ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5915baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 592ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 593ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 594ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case DrawPoints: { 595ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int count = 0; 596ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float* points = getFloats(count); 5975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 5985baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 599ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 600ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 601325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 602325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 603325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 604325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 605325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 606325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 607325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 608325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 609325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 610325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 611325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 612eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 613eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 614eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int count = getInt(); 615eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy int positionsCount = 0; 616eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 6175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 618eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 619a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase text.text(), text.length(), count, paint); 620eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 621996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 622c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy case DrawText: { 623996e57c84368058be793897ebc355b917a59abc2Raph Levien getText(&text); 62418edb81172daa9b98b53d226d94fc03249b1adedRomain Guy int32_t count = getInt(); 62518edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float x = getFloat(); 62618edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float y = getFloat(); 62718edb81172daa9b98b53d226d94fc03249b1adedRomain Guy int32_t positionsCount = 0; 628996e57c84368058be793897ebc355b917a59abc2Raph Levien float* positions = getFloats(positionsCount); 629996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPaint* paint = getPaint(renderer); 63018edb81172daa9b98b53d226d94fc03249b1adedRomain Guy float length = getFloat(); 631996e57c84368058be793897ebc355b917a59abc2Raph Levien ALOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 632996e57c84368058be793897ebc355b917a59abc2Raph Levien text.text(), text.length(), count, paint); 633996e57c84368058be793897ebc355b917a59abc2Raph Levien } 634996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 635ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShader: { 6365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 637ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 638ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 639ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShader: { 640ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaShader* shader = getShader(); 6415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 642ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 643ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 644ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetColorFilter: { 6455baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 646ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 647ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 648ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupColorFilter: { 649ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 6505baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 651ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 652ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 653ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case ResetShadow: { 6545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 655ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 656ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 657ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase case SetupShadow: { 658ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float radius = getFloat(); 659ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dx = getFloat(); 660ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase float dy = getFloat(); 661ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase int color = getInt(); 6625baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 663a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 664ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 665ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 6665ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 6675ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s", (char*) indent, OP_NAMES[op]); 6685ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6695ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 6705ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 6715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int clearBits = getInt(); 6725ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy int setBits = getInt(); 6735ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ALOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], clearBits, setBits); 6745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 6755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 676ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase default: 6775baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("Display List error: op not handled: %s%s", 678a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 679ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase break; 680ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 681ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase } 682a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase ALOGD("%sDone (%p, %s)", (char*) indent + 2, this, mName.string()); 683a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 684a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 685a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::updateMatrix() { 686a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixDirty) { 687a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformMatrix) { 688a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix = new SkMatrix(); 689a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 690a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mMatrixFlags == 0 || mMatrixFlags == TRANSLATION) { 691a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 692a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 693a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mPivotExplicitlySet) { 694a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mWidth != mPrevWidth || mHeight != mPrevHeight) { 695a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevWidth = mWidth; 696a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPrevHeight = mHeight; 697a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotX = mPrevWidth / 2; 698a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY = mPrevHeight / 2; 699a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 700a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 701a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if ((mMatrixFlags & ROTATION_3D) == 0) { 702a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->setTranslate(mTranslationX, mTranslationY); 703a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preRotate(mRotation, mPivotX, mPivotY); 704a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 705a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } else { 706a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (!mTransformCamera) { 707a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera = new Sk3DView(); 708a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D = new SkMatrix(); 709a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 710a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->reset(); 711a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->save(); 712a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->preScale(mScaleX, mScaleY, mPivotX, mPivotY); 713a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateX(mRotationX); 714a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateY(mRotationY); 715a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->rotateZ(-mRotation); 716a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->getMatrix(mTransformMatrix3D); 717a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->preTranslate(-mPivotX, -mPivotY); 718a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix3D->postTranslate(mPivotX + mTranslationX, 719a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mPivotY + mTranslationY); 720a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformMatrix->postConcat(*mTransformMatrix3D); 721a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mTransformCamera->restore(); 722a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 723a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 724a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase mMatrixDirty = false; 725a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 726a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 727a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 728a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haasevoid DisplayList::outputViewProperties(OpenGLRenderer& renderer, char* indent) { 7291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase updateMatrix(); 7301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mLeft != 0 || mTop != 0) { 7311271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 7321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mStaticMatrix) { 7341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 7361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 7371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 7381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 7391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 7401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(8)); 7411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAnimationMatrix) { 7431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7441271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 7451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 7461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 7471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 7481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 7491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(8)); 7501271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags != 0) { 7521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags == TRANSLATION) { 7531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 7541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 7559420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase ALOGD("%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix", mTransformMatrix, 7571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 7581271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 7591271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 7601271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 7611271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(8)); 7629d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 7631271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7641271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAlpha < 1 && !mCaching) { 7651271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // TODO: should be able to store the size of a DL at record time and not 7661271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // have to pass it into this call. In fact, this information might be in the 7671271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // location/size info that we store with the new native transform data. 7681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 769a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase if (mClipChildren) { 7701271e2cc80b01d577e9db339459ef0222bb9320dChet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 771a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 7721271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 7731271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 7741271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 7751271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7761271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 7771271e2cc80b01d577e9db339459ef0222bb9320dChet Haase ALOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 7781271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) mRight - mLeft, (float) mBottom - mTop); 779a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 780a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 781ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 7821271e2cc80b01d577e9db339459ef0222bb9320dChet Haasevoid DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) { 783a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#if DEBUG_DISPLAY_LIST 784a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase uint32_t count = (level + 1) * 2; 785a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase char indent[count + 1]; 786a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase for (uint32_t i = 0; i < count; i++) { 787a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[i] = ' '; 788a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 789a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase indent[count] = '\0'; 790a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#endif 7911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase updateMatrix(); 7921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mLeft != 0 || mTop != 0) { 7931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d, %d", indent, "Translate (left, top)", mLeft, mTop); 7941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.translate(mLeft, mTop); 7951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 7961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mStaticMatrix) { 7971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD( 7981271e2cc80b01d577e9db339459ef0222bb9320dChet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 7991271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (static)", mStaticMatrix, 8001271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(0), mStaticMatrix->get(1), 8011271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(2), mStaticMatrix->get(3), 8021271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(4), mStaticMatrix->get(5), 8031271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(6), mStaticMatrix->get(7), 8041271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mStaticMatrix->get(8)); 8051271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mStaticMatrix); 8061271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else if (mAnimationMatrix) { 8071271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD( 8081271e2cc80b01d577e9db339459ef0222bb9320dChet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 8091271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix (animation)", mAnimationMatrix, 8101271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(0), mAnimationMatrix->get(1), 8111271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(2), mAnimationMatrix->get(3), 8121271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(4), mAnimationMatrix->get(5), 8131271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(6), mAnimationMatrix->get(7), 8141271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mAnimationMatrix->get(8)); 8151271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mAnimationMatrix); 8161271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8171271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags != 0) { 8181271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mMatrixFlags == TRANSLATION) { 8191271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %f, %f", indent, "Translate", mTranslationX, mTranslationY); 8201271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.translate(mTranslationX, mTranslationY); 8211271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 8229420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase DISPLAY_LIST_LOGD( 8239420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 8241271e2cc80b01d577e9db339459ef0222bb9320dChet Haase indent, "ConcatMatrix", mTransformMatrix, 8251271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(0), mTransformMatrix->get(1), 8261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(2), mTransformMatrix->get(3), 8271271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(4), mTransformMatrix->get(5), 8281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(6), mTransformMatrix->get(7), 8291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mTransformMatrix->get(8)); 8301271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.concatMatrix(mTransformMatrix); 831a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 8321271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8331271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mAlpha < 1 && !mCaching) { 8341271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (!mHasOverlappingRendering) { 8351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", indent, "SetAlpha", mAlpha); 8361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.setAlpha(mAlpha); 8371271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } else { 8381271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // TODO: should be able to store the size of a DL at record time and not 8391271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // have to pass it into this call. In fact, this information might be in the 8401271e2cc80b01d577e9db339459ef0222bb9320dChet Haase // location/size info that we store with the new native transform data. 8411271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int flags = SkCanvas::kHasAlphaLayer_SaveFlag; 8421271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 8431271e2cc80b01d577e9db339459ef0222bb9320dChet Haase flags |= SkCanvas::kClipToLayer_SaveFlag; 8449d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 8451271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", indent, "SaveLayerAlpha", 8461271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) 0, (float) 0, (float) mRight - mLeft, (float) mBottom - mTop, 8471271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 8481271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.saveLayerAlpha(0, 0, mRight - mLeft, mBottom - mTop, 8491271e2cc80b01d577e9db339459ef0222bb9320dChet Haase mMultipliedAlpha, flags); 8509d1992deaeb3d60d5928f05b649a2cc654ba98a3Chet Haase } 8511271e2cc80b01d577e9db339459ef0222bb9320dChet Haase } 8521271e2cc80b01d577e9db339459ef0222bb9320dChet Haase if (mClipChildren) { 8531271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f", indent, "ClipRect", 0.0f, 0.0f, 8541271e2cc80b01d577e9db339459ef0222bb9320dChet Haase (float) mRight - mLeft, (float) mBottom - mTop); 8551271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.clipRect(0, 0, mRight - mLeft, mBottom - mTop, 8561271e2cc80b01d577e9db339459ef0222bb9320dChet Haase SkRegion::kIntersect_Op); 857a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 858a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase} 859a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase 860ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase/** 861ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * Changes to replay(), specifically those involving opcode or parameter changes, should be mimicked 862ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * in the output() function, since that function processes the same list of opcodes for the 863ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase * purposes of logging display list info for a given view. 864ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase */ 8651271e2cc80b01d577e9db339459ef0222bb9320dChet Haasestatus_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) { 866486590963e2207d68eebd6944fec70d50d41116aChet Haase status_t drawGlStatus = DrawGlInfo::kStatusDone; 867b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy TextContainer text; 868b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mReader.rewind(); 869b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 870ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 871ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy uint32_t count = (level + 1) * 2; 872ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy char indent[count + 1]; 873ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy for (uint32_t i = 0; i < count; i++) { 874ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[i] = ' '; 875ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy } 876ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy indent[count] = '\0'; 877a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase Rect* clipRect = renderer.getClipRect(); 878a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase DISPLAY_LIST_LOGD("%sStart display list (%p, %s), clipRect: %.0f, %.f, %.0f, %.0f", 879a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase (char*) indent + 2, this, mName.string(), clipRect->left, clipRect->top, 880a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haase clipRect->right, clipRect->bottom); 881ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 882b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 88313631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark(mName.string()); 8848a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 8851271e2cc80b01d577e9db339459ef0222bb9320dChet Haase int restoreTo = renderer.save(SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 8861271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d %d", indent, "Save", 8871271e2cc80b01d577e9db339459ef0222bb9320dChet Haase SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag, restoreTo); 8881271e2cc80b01d577e9db339459ef0222bb9320dChet Haase setViewProperties(renderer, level); 8898a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 8908a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy if (renderer.quickRejectNoScissor(0, 0, mWidth, mHeight)) { 891b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 892b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.restoreToCount(restoreTo); 893b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase renderer.endMark(); 894486590963e2207d68eebd6944fec70d50d41116aChet Haase return drawGlStatus; 895b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 89613631f3da855f200a151e7837ed9f6b079622b58Romain Guy 8979c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance(); 898ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy int saveCount = renderer.getSaveCount() - 1; 8998a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 900b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy while (!mReader.eof()) { 9015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int op = mReader.readInt(); 90233f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (op & OP_MAY_BE_SKIPPED_MASK) { 903390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy int32_t skip = mReader.readInt(); 90433f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(flags & kReplayFlag_ClipChildren)) { 90533f6beb10f98e8ba96250e284876d607055d278dRomain Guy mReader.skip(skip); 90633f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s skipping %d bytes", (char*) indent, 90733f6beb10f98e8ba96250e284876d607055d278dRomain Guy OP_NAMES[op & ~OP_MAY_BE_SKIPPED_MASK], skip); 90833f6beb10f98e8ba96250e284876d607055d278dRomain Guy continue; 90933f6beb10f98e8ba96250e284876d607055d278dRomain Guy } else { 91033f6beb10f98e8ba96250e284876d607055d278dRomain Guy op &= ~OP_MAY_BE_SKIPPED_MASK; 91133f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 91233f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 9139c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase logBuffer.writeCommand(level, op); 914ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 9158a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#if DEBUG_DISPLAY_LIST_OPS_AS_EVENTS 9168a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy Caches::getInstance().eventMark(strlen(OP_NAMES[op]), OP_NAMES[op]); 9178a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy#endif 9188a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guy 9195b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy switch (op) { 920daf98e941e140e8739458126640183b9f296a2abChet Haase case DrawGLFunction: { 921daf98e941e140e8739458126640183b9f296a2abChet Haase Functor *functor = (Functor *) getInt(); 922daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], functor); 92313631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.startMark("GL functor"); 9246554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus |= renderer.callDrawGLFunction(functor, dirty); 92513631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 926daf98e941e140e8739458126640183b9f296a2abChet Haase } 927daf98e941e140e8739458126640183b9f296a2abChet Haase break; 928b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Save: { 92933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t rendererNum = getInt(); 930daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], rendererNum); 931daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.save(rendererNum); 932b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 933b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 934b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Restore: { 935daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 936b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.restore(); 937b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 938b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 939b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case RestoreToCount: { 94033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t restoreCount = saveCount + getInt(); 941daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, OP_NAMES[op], restoreCount); 942daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.restoreToCount(restoreCount); 943b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 944b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 945b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SaveLayer: { 946daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 947daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 948daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 949daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 9505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 95133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 952daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p, 0x%x", (char*) indent, 953a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, paint, flags); 954daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayer(f1, f2, f3, f4, paint, flags); 955b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 956b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 9575b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy case SaveLayerAlpha: { 958daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 959daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 960daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 961daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 96233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t alpha = getInt(); 96333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 964daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d, 0x%x", (char*) indent, 965a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase OP_NAMES[op], f1, f2, f3, f4, alpha, flags); 966daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.saveLayerAlpha(f1, f2, f3, f4, alpha, flags); 9675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy } 9685b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy break; 969b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Translate: { 970daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 971daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 972daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], f1, f2); 973daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.translate(f1, f2); 974b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 975b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 976b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Rotate: { 977daf98e941e140e8739458126640183b9f296a2abChet Haase float rotation = getFloat(); 978daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f", (char*) indent, OP_NAMES[op], rotation); 979daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.rotate(rotation); 980b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 981b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 982b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case Scale: { 983daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 984daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 985daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 986daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.scale(sx, sy); 987b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 988b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 989807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy case Skew: { 990daf98e941e140e8739458126640183b9f296a2abChet Haase float sx = getFloat(); 991daf98e941e140e8739458126640183b9f296a2abChet Haase float sy = getFloat(); 992daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f", (char*) indent, OP_NAMES[op], sx, sy); 993daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.skew(sx, sy); 994807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy } 995807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy break; 996b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetMatrix: { 997daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 998daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], matrix); 999daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setMatrix(matrix); 1000b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1001b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1002b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ConcatMatrix: { 1003daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 1004a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD( 1005a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase "%s%s %p: [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f] [%.2f, %.2f, %.2f]", 1006a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], matrix, 1007a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(0), matrix->get(1), matrix->get(2), 1008a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(3), matrix->get(4), matrix->get(5), 1009a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase matrix->get(6), matrix->get(7), matrix->get(8)); 1010daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.concatMatrix(matrix); 1011b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1012b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1013b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ClipRect: { 1014daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1015daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1016daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1017daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 101833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t regionOp = getInt(); 1019daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %d", (char*) indent, OP_NAMES[op], 1020a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, regionOp); 1021daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.clipRect(f1, f2, f3, f4, (SkRegion::Op) regionOp); 1022b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1023b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 10240fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy case DrawDisplayList: { 1025daf98e941e140e8739458126640183b9f296a2abChet Haase DisplayList* displayList = getDisplayList(); 102633f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t flags = getInt(); 102733f6beb10f98e8ba96250e284876d607055d278dRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %dx%d, 0x%x %d", (char*) indent, OP_NAMES[op], 10281271e2cc80b01d577e9db339459ef0222bb9320dChet Haase displayList, mWidth, mHeight, flags, level + 1); 10291271e2cc80b01d577e9db339459ef0222bb9320dChet Haase drawGlStatus |= renderer.drawDisplayList(displayList, dirty, flags, level + 1); 10300fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 10310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy break; 10326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy case DrawLayer: { 1033d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase int oldAlpha = -1; 1034daf98e941e140e8739458126640183b9f296a2abChet Haase Layer* layer = (Layer*) getInt(); 1035daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 1036daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 10375ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1038d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (mCaching && mMultipliedAlpha < 255) { 1039d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase oldAlpha = layer->getAlpha(); 1040d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase layer->setAlpha(mMultipliedAlpha); 1041a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase } 1042daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1043a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase layer, x, y, paint); 1044486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawLayer(layer, x, y, paint); 1045d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (oldAlpha >= 0) { 1046d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase layer->setAlpha(oldAlpha); 1047d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 10486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy } 10496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy break; 1050b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmap: { 1051d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase int oldAlpha = -1; 1052daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1053daf98e941e140e8739458126640183b9f296a2abChet Haase float x = getFloat(); 1054daf98e941e140e8739458126640183b9f296a2abChet Haase float y = getFloat(); 10555ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1056d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (mCaching && mMultipliedAlpha < 255) { 1057d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase oldAlpha = paint->getAlpha(); 1058b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase paint->setAlpha(mMultipliedAlpha); 1059b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase } 1060daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1061a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, x, y, paint); 1062486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint); 1063d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (oldAlpha >= 0) { 1064d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase paint->setAlpha(oldAlpha); 1065d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 1066b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1067b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1068b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapMatrix: { 1069daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1070daf98e941e140e8739458126640183b9f296a2abChet Haase SkMatrix* matrix = getMatrix(); 10715ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1072daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op], 1073a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase bitmap, matrix, paint); 1074486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint); 1075b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1076b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1077b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawBitmapRect: { 1078daf98e941e140e8739458126640183b9f296a2abChet Haase SkBitmap* bitmap = getBitmap(); 1079daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1080daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1081daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1082daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1083daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1084daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 1085daf98e941e140e8739458126640183b9f296a2abChet Haase float f7 = getFloat(); 1086daf98e941e140e8739458126640183b9f296a2abChet Haase float f8 = getFloat(); 10875ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1088daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1089a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], bitmap, 1090a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, f5, f6, f7, f8,paint); 1091486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint); 1092b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1093b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1094e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy case DrawBitmapData: { 1095e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkBitmap* bitmap = getBitmapData(); 1096e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float x = getFloat(); 1097e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy float y = getFloat(); 1098e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy SkPaint* paint = getPaint(renderer); 1099e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1100e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy bitmap, x, y, paint); 1101486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint); 1102e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy } 1103e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy break; 11045a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy case DrawBitmapMesh: { 110533f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t verticesCount = 0; 11065a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t colorsCount = 0; 11075a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 11085a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy SkBitmap* bitmap = getBitmap(); 11095a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshWidth = getInt(); 11105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy uint32_t meshHeight = getInt(); 11115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices = getFloats(verticesCount); 11125a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy bool hasColors = getInt(); 111333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t* colors = hasColors ? getInts(colorsCount) : NULL; 11145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 11155a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 1116daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1117486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, 1118486590963e2207d68eebd6944fec70d50d41116aChet Haase colors, paint); 11195a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 1120a566b7c3aada08d37cf08096c972e3e641bed773Romain Guy break; 1121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPatch: { 1122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* xDivs = NULL; 1123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* yDivs = NULL; 11244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* colors = NULL; 1125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t xDivsCount = 0; 1126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy uint32_t yDivsCount = 0; 11274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy int8_t numColors = 0; 1128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* bitmap = getBitmap(); 1130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy xDivs = getInts(xDivsCount); 1132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy yDivs = getInts(yDivsCount); 11334bb942083a0d4db746adf95349108dd8ef842e32Romain Guy colors = getUInts(numColors); 1134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 11359ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float left = getFloat(); 11369ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float top = getFloat(); 11379ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float right = getFloat(); 11389ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy float bottom = getFloat(); 1139be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 1140be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha = getInt(); 1141be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode = (SkXfermode::Mode) getInt(); 11429ff3cb57ee46ac5242a7d8f08e0c66189fda2e66Romain Guy 1143daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1144486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors, 1145be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy xDivsCount, yDivsCount, numColors, left, top, right, bottom, 1146be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy alpha, mode); 1147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawColor: { 115033f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 115133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t xferMode = getInt(); 1152daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode); 1153486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode); 1154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawRect: { 1157daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1158daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1159daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1160daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 11615ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1162daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op], 1163a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase f1, f2, f3, f4, paint); 1164486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint); 1165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 116701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawRoundRect: { 1168daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1169daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1170daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1171daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1172daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1173daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 11745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1175daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p", 1176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint); 1177486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint); 117801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 117901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 118001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy case DrawCircle: { 1181daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1182daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1183daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 11845ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1185daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p", 1186a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, paint); 1187486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint); 118801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy } 118901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy break; 1190c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy case DrawOval: { 1191daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1192daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1193daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1194daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 11955ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1196daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", 1197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint); 1198486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint); 1199c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy } 1200c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy break; 12018b2f5267f16c295f12faab810527cd6311997e34Romain Guy case DrawArc: { 1202daf98e941e140e8739458126640183b9f296a2abChet Haase float f1 = getFloat(); 1203daf98e941e140e8739458126640183b9f296a2abChet Haase float f2 = getFloat(); 1204daf98e941e140e8739458126640183b9f296a2abChet Haase float f3 = getFloat(); 1205daf98e941e140e8739458126640183b9f296a2abChet Haase float f4 = getFloat(); 1206daf98e941e140e8739458126640183b9f296a2abChet Haase float f5 = getFloat(); 1207daf98e941e140e8739458126640183b9f296a2abChet Haase float f6 = getFloat(); 120833f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t i1 = getInt(); 12095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1210daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p", 1211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint); 1212486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint); 12138b2f5267f16c295f12faab810527cd6311997e34Romain Guy } 12148b2f5267f16c295f12faab810527cd6311997e34Romain Guy break; 1215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawPath: { 1216daf98e941e140e8739458126640183b9f296a2abChet Haase SkPath* path = getPath(); 12175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1218daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint); 1219486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPath(path, paint); 1220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case DrawLines: { 122333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* points = getFloats(count); 12255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1226daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1227486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawLines(points, count, paint); 1228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1230ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy case DrawPoints: { 123133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = 0; 1232ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy float* points = getFloats(count); 12335ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1234ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1235486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPoints(points, count, paint); 1236ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy } 1237ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy break; 1238325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy case DrawTextOnPath: { 1239325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy getText(&text); 1240325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy int32_t count = getInt(); 1241325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPath* path = getPath(); 1242325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset = getFloat(); 1243325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float vOffset = getFloat(); 1244325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy SkPaint* paint = getPaint(renderer); 1245325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op], 1246325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy text.text(), text.length(), count, paint); 1247486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path, 1248325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy hOffset, vOffset, paint); 1249325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy } 1250325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy break; 1251eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy case DrawPosText: { 1252eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy getText(&text); 125333f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t count = getInt(); 125433f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t positionsCount = 0; 1255eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy float* positions = getFloats(positionsCount); 12565ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* paint = getPaint(renderer); 1257eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, 1258eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy OP_NAMES[op], text.text(), text.length(), count, paint); 1259486590963e2207d68eebd6944fec70d50d41116aChet Haase drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count, 1260486590963e2207d68eebd6944fec70d50d41116aChet Haase positions, paint); 1261eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy } 1262eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy break; 1263c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy case DrawText: { 1264996e57c84368058be793897ebc355b917a59abc2Raph Levien getText(&text); 1265996e57c84368058be793897ebc355b917a59abc2Raph Levien int32_t count = getInt(); 1266996e57c84368058be793897ebc355b917a59abc2Raph Levien float x = getFloat(); 1267996e57c84368058be793897ebc355b917a59abc2Raph Levien float y = getFloat(); 1268996e57c84368058be793897ebc355b917a59abc2Raph Levien int32_t positionsCount = 0; 1269996e57c84368058be793897ebc355b917a59abc2Raph Levien float* positions = getFloats(positionsCount); 1270996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPaint* paint = getPaint(renderer); 1271996e57c84368058be793897ebc355b917a59abc2Raph Levien float length = getFloat(); 1272996e57c84368058be793897ebc355b917a59abc2Raph Levien DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent, 1273996e57c84368058be793897ebc355b917a59abc2Raph Levien OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length); 1274c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy drawGlStatus |= renderer.drawText(text.text(), text.length(), count, 1275996e57c84368058be793897ebc355b917a59abc2Raph Levien x, y, positions, paint, length); 1276996e57c84368058be793897ebc355b917a59abc2Raph Levien } 1277996e57c84368058be793897ebc355b917a59abc2Raph Levien break; 1278b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShader: { 1279daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShader(); 1281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShader: { 1284daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaShader* shader = getShader(); 1285daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], shader); 1286daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShader(shader); 1287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetColorFilter: { 1290daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetColorFilter(); 1292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupColorFilter: { 1295daf98e941e140e8739458126640183b9f296a2abChet Haase SkiaColorFilter *colorFilter = getColorFilter(); 1296daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %p", (char*) indent, OP_NAMES[op], colorFilter); 1297daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupColorFilter(colorFilter); 1298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1299b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1300b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case ResetShadow: { 1301daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 1302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy renderer.resetShadow(); 1303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy break; 1305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy case SetupShadow: { 1306daf98e941e140e8739458126640183b9f296a2abChet Haase float radius = getFloat(); 1307daf98e941e140e8739458126640183b9f296a2abChet Haase float dx = getFloat(); 1308daf98e941e140e8739458126640183b9f296a2abChet Haase float dy = getFloat(); 130933f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t color = getInt(); 1310daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, 0x%x", (char*) indent, OP_NAMES[op], 1311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase radius, dx, dy, color); 1312daf98e941e140e8739458126640183b9f296a2abChet Haase renderer.setupShadow(radius, dx, dy, color); 1313daf98e941e140e8739458126640183b9f296a2abChet Haase } 1314daf98e941e140e8739458126640183b9f296a2abChet Haase break; 13155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case ResetPaintFilter: { 13165ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]); 13175ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.resetPaintFilter(); 13185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 13195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 13205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy case SetupPaintFilter: { 132133f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t clearBits = getInt(); 132233f6beb10f98e8ba96250e284876d607055d278dRomain Guy int32_t setBits = getInt(); 13235ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy DISPLAY_LIST_LOGD("%s%s 0x%x, 0x%x", (char*) indent, OP_NAMES[op], 13245ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy clearBits, setBits); 13255ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy renderer.setupPaintFilter(clearBits, setBits); 13265ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy } 13275ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy break; 1328daf98e941e140e8739458126640183b9f296a2abChet Haase default: 1329daf98e941e140e8739458126640183b9f296a2abChet Haase DISPLAY_LIST_LOGD("Display List error: op not handled: %s%s", 1330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase (char*) indent, OP_NAMES[op]); 1331daf98e941e140e8739458126640183b9f296a2abChet Haase break; 1332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 1334ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 13351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo); 13361271e2cc80b01d577e9db339459ef0222bb9320dChet Haase renderer.restoreToCount(restoreTo); 133713631f3da855f200a151e7837ed9f6b079622b58Romain Guy renderer.endMark(); 133813631f3da855f200a151e7837ed9f6b079622b58Romain Guy 1339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase DISPLAY_LIST_LOGD("%sDone (%p, %s), returning %d", (char*) indent + 2, this, mName.string(), 13406554943a1dd6854c0f4976900956e556767b49e1Romain Guy drawGlStatus); 13416554943a1dd6854c0f4976900956e556767b49e1Romain Guy return drawGlStatus; 1342b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1344b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 13454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Base structure 13464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 13474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 134858ecc204fbcacef34806290492384677a330d4d4Romain GuyDisplayListRenderer::DisplayListRenderer(): 134958ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches(Caches::getInstance()), mWriter(MIN_WRITER_SIZE), 135054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mTranslateX(0.0f), mTranslateY(0.0f), mHasTranslate(false), 135154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mHasDrawOps(false), mFunctorCount(0) { 13524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain GuyDisplayListRenderer::~DisplayListRenderer() { 13554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy reset(); 13564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 13574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 13584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::reset() { 13594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.reset(); 13605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 136158ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.lock(); 136258ecc204fbcacef34806290492384677a330d4d4Romain Guy 13635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase for (size_t i = 0; i < mBitmapResources.size(); i++) { 136458ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mBitmapResources.itemAt(i)); 13655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1366d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 136749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy for (size_t i = 0; i < mOwnedBitmapResources.size(); i++) { 136858ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mOwnedBitmapResources.itemAt(i)); 136949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 137049c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 1371d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy for (size_t i = 0; i < mFilterResources.size(); i++) { 137258ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mFilterResources.itemAt(i)); 1373d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 1374d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 137543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy for (size_t i = 0; i < mShaders.size(); i++) { 137658ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mShaders.itemAt(i)); 137743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy } 137843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy 1379d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase for (size_t i = 0; i < mSourcePaths.size(); i++) { 138058ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.decrementRefcountLocked(mSourcePaths.itemAt(i)); 1381d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 138258ecc204fbcacef34806290492384677a330d4d4Romain Guy 1383603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase for (size_t i = 0; i < mLayers.size(); i++) { 1384603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mCaches.resourceCache.decrementRefcountLocked(mLayers.itemAt(i)); 1385603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 1386603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 138758ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.unlock(); 138858ecc204fbcacef34806290492384677a330d4d4Romain Guy 138958ecc204fbcacef34806290492384677a330d4d4Romain Guy mBitmapResources.clear(); 139058ecc204fbcacef34806290492384677a330d4d4Romain Guy mOwnedBitmapResources.clear(); 139158ecc204fbcacef34806290492384677a330d4d4Romain Guy mFilterResources.clear(); 1392d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.clear(); 1393d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 139458ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaders.clear(); 139558ecc204fbcacef34806290492384677a330d4d4Romain Guy mShaderMap.clear(); 139658ecc204fbcacef34806290492384677a330d4d4Romain Guy 139743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaints.clear(); 139843ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy mPaintMap.clear(); 1399d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 14002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPaths.clear(); 14012fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.clear(); 1402d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 1403d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mMatrices.clear(); 140404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 1405603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mLayers.clear(); 1406603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 140704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = false; 140854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount = 0; 14094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 14124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Operations 14134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 14144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1415162a0217563f4665da6eb183dfce0fef740f641fJeff BrownDisplayList* DisplayListRenderer::getDisplayList(DisplayList* displayList) { 1416162a0217563f4665da6eb183dfce0fef740f641fJeff Brown if (!displayList) { 1417162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList = new DisplayList(*this); 14185977baa1fa24125c148a72699b53e62abaf08960Chet Haase } else { 1419162a0217563f4665da6eb183dfce0fef740f641fJeff Brown displayList->initFromDisplayListRenderer(*this, true); 14205977baa1fa24125c148a72699b53e62abaf08960Chet Haase } 142104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy displayList->setRenderable(mHasDrawOps); 1422162a0217563f4665da6eb183dfce0fef740f641fJeff Brown return displayList; 14235977baa1fa24125c148a72699b53e62abaf08960Chet Haase} 14245977baa1fa24125c148a72699b53e62abaf08960Chet Haase 142549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guybool DisplayListRenderer::isDeferred() { 142649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy return true; 142749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy} 142849c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 1429b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyvoid DisplayListRenderer::setViewport(int width, int height) { 1430b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); 1431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWidth = width; 1433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mHeight = height; 1434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 143644b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haaseint DisplayListRenderer::prepareDirty(float left, float top, 14377d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy float right, float bottom, bool opaque) { 1438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot = new Snapshot(mFirstSnapshot, 1439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); 1440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSaveCount = 1; 144145e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 1442b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mSnapshot->setClip(0.0f, 0.0f, mWidth, mHeight); 144345e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy mDirtyClip = opaque; 144445e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 144527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 144645e4c3df6c00ac98ff6144de9af574877d4fff19Romain Guy 144744b2fe3fc114ee5f7273c6b0fee2cc999bf244a2Chet Haase return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 144827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy} 144927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 145027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guyvoid DisplayListRenderer::finish() { 145127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 145233f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 1453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy} 1454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1455daf98e941e140e8739458126640183b9f296a2abChet Haasevoid DisplayListRenderer::interrupt() { 1456daf98e941e140e8739458126640183b9f296a2abChet Haase} 1457daf98e941e140e8739458126640183b9f296a2abChet Haase 14582b1847ea60650a9f68372abe860415f18b55081dRomain Guyvoid DisplayListRenderer::resume() { 14594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14616554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::callDrawGLFunction(Functor *functor, Rect& dirty) { 1462cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // Ignore dirty during recording, it matters only when we replay 1463daf98e941e140e8739458126640183b9f296a2abChet Haase addOp(DisplayList::DrawGLFunction); 1464daf98e941e140e8739458126640183b9f296a2abChet Haase addInt((int) functor); 146554c1a64d5441a964890b44280e4457e11f4f924aRomain Guy mFunctorCount++; 14666554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; // No invalidate needed at record-time 1467daf98e941e140e8739458126640183b9f296a2abChet Haase} 1468daf98e941e140e8739458126640183b9f296a2abChet Haase 14694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::save(int flags) { 1470b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Save); 14714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 14724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::save(flags); 14734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restore() { 147604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy if (mRestoreSaveCount < 0) { 147733f6beb10f98e8ba96250e284876d607055d278dRomain Guy restoreToCount(getSaveCount() - 1); 147833f6beb10f98e8ba96250e284876d607055d278dRomain Guy return; 147904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 148033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 148133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mRestoreSaveCount--; 148233f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 14834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restore(); 14844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::restoreToCount(int saveCount) { 148727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = saveCount; 148833f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertTranlate(); 14894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::restoreToCount(saveCount); 14904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 14914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 14924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyint DisplayListRenderer::saveLayer(float left, float top, float right, float bottom, 14935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags) { 1494b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SaveLayer); 14954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 14964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(p); 14974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(flags); 1498b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return OpenGLRenderer::save(flags); 14994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15015b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guyint DisplayListRenderer::saveLayerAlpha(float left, float top, float right, float bottom, 15025b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags) { 15035b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addOp(DisplayList::SaveLayerAlpha); 15045b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addBounds(left, top, right, bottom); 15055b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(alpha); 15065b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy addInt(flags); 15075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy return OpenGLRenderer::save(flags); 15085b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy} 15095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy 15104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::translate(float dx, float dy) { 151133f6beb10f98e8ba96250e284876d607055d278dRomain Guy mHasTranslate = true; 151233f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateX += dx; 151333f6beb10f98e8ba96250e284876d607055d278dRomain Guy mTranslateY += dy; 151433f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 15154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::translate(dx, dy); 15164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::rotate(float degrees) { 1519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Rotate); 15204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(degrees); 15214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::rotate(degrees); 15224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::scale(float sx, float sy) { 1525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::Scale); 15264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(sx, sy); 15274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::scale(sx, sy); 15284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1530807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guyvoid DisplayListRenderer::skew(float sx, float sy) { 1531807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addOp(DisplayList::Skew); 1532807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy addPoint(sx, sy); 1533807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy OpenGLRenderer::skew(sx, sy); 1534807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy} 1535807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy 15364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setMatrix(SkMatrix* matrix) { 1537b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetMatrix); 15384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::setMatrix(matrix); 15404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::concatMatrix(SkMatrix* matrix) { 1543b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ConcatMatrix); 15444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy OpenGLRenderer::concatMatrix(matrix); 15464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guybool DisplayListRenderer::clipRect(float left, float top, float right, float bottom, 15494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkRegion::Op op) { 1550b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ClipRect); 15514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 15524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(op); 15534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy return OpenGLRenderer::clipRect(left, top, right, bottom, op); 15544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 15566554943a1dd6854c0f4976900956e556767b49e1Romain Guystatus_t DisplayListRenderer::drawDisplayList(DisplayList* displayList, 15571271e2cc80b01d577e9db339459ef0222bb9320dChet Haase Rect& dirty, int32_t flags, uint32_t level) { 1558cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // dirty is an out parameter and should not be recorded, 1559cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy // it matters only when replaying the display list 1560b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase 1561b85967b9af76e1e60f7a96603e2567a6449d2e04Chet Haase addOp(DisplayList::DrawDisplayList); 15620fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addDisplayList(displayList); 156333f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(flags); 15646554943a1dd6854c0f4976900956e556767b49e1Romain Guy return DrawGlInfo::kStatusDone; 15650fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy} 15660fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 1567486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { 15686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addOp(DisplayList::DrawLayer); 1569603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase addLayer(layer); 1570ada830f639591b99c3e40de22b07296c7932a33fRomain Guy addPoint(x, y); 15716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy addPaint(paint); 1572486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15736c319ca1275c8db892c39b48fc54864c949f9171Romain Guy} 15746c319ca1275c8db892c39b48fc54864c949f9171Romain Guy 1575486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) { 157633f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height()); 157733f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmap, reject); 15784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 15794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(left, top); 15804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 158133f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1582486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1585486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) { 158633f6beb10f98e8ba96250e284876d607055d278dRomain Guy Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height()); 158733f6beb10f98e8ba96250e284876d607055d278dRomain Guy const mat4 transform(*matrix); 158833f6beb10f98e8ba96250e284876d607055d278dRomain Guy transform.mapRect(r); 158933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 159033f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(r.left, r.top, r.right, r.bottom); 159133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapMatrix, reject); 15924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 15934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addMatrix(matrix); 15944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 159533f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1596486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 15974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 15984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1599486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 16004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 16015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint) { 160233f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom); 160333f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapRect, reject); 16044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 16054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(srcLeft, srcTop, srcRight, srcBottom); 16064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(dstLeft, dstTop, dstRight, dstBottom); 16074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 160833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1609486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1612486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, 1613486590963e2207d68eebd6944fec70d50d41116aChet Haase SkPaint* paint) { 161495c21d0546e36ade3e0601394f5b625541836545Romain Guy const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height()); 1615e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy uint32_t* location = addOp(DisplayList::DrawBitmapData, reject); 1616e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addBitmapData(bitmap); 1617e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addPoint(left, top); 1618e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addPaint(paint); 1619e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy addSkip(location); 1620486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1621e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy} 1622e651cc6239616a202f6e96ebc2ed93b4b8b3627cRomain Guy 1623486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 16245a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint) { 16255a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addOp(DisplayList::DrawBitmapMesh); 16265a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addBitmap(bitmap); 16275a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshWidth); 16285a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(meshHeight); 16295a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addFloats(vertices, (meshWidth + 1) * (meshHeight + 1) * 2); 16305a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy if (colors) { 16315a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(1); 16325a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInts(colors, (meshWidth + 1) * (meshHeight + 1)); 16335a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } else { 16345a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addInt(0); 16355a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy } 16365a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy addPaint(paint); 1637486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16385a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy} 16395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy 1640486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, 1641486590963e2207d68eebd6944fec70d50d41116aChet Haase const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height, 1642486590963e2207d68eebd6944fec70d50d41116aChet Haase int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) { 1643be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy int alpha; 1644be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy SkXfermode::Mode mode; 1645be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode); 1646be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy 164733f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = quickReject(left, top, right, bottom); 164833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPatch, reject); 16494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBitmap(bitmap); 16504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(xDivs, width); 16514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInts(yDivs, height); 16524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy addUInts(colors, numColors); 16534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 1654be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy addInt(alpha); 1655be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy addInt(mode); 165633f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1657486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1660486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) { 1661b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawColor); 16624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 16634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(mode); 1664486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1667486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom, 16685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* paint) { 166933f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 167033f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 167133f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRect, reject); 16724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addBounds(left, top, right, bottom); 16734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 167433f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1675486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 16764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 16774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1678486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom, 1679a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase float rx, float ry, SkPaint* paint) { 168033f6beb10f98e8ba96250e284876d607055d278dRomain Guy const bool reject = paint->getStyle() == SkPaint::kFill_Style && 168133f6beb10f98e8ba96250e284876d607055d278dRomain Guy quickReject(left, top, right, bottom); 168233f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawRoundRect, reject); 168301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addBounds(left, top, right, bottom); 168401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(rx, ry); 168501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 168633f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1687486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 168801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 168901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1690486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { 169101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addOp(DisplayList::DrawCircle); 169201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPoint(x, y); 169301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addFloat(radius); 169401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy addPaint(paint); 1695486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 169601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy} 169701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy 1698486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom, 1699c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy SkPaint* paint) { 1700c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addOp(DisplayList::DrawOval); 1701c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addBounds(left, top, right, bottom); 1702c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy addPaint(paint); 1703486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1704c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy} 1705c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy 1706486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom, 17078b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) { 170882d41a515368236e56454bd84023bebd6306f6b7Romain Guy addOp(DisplayList::DrawArc); 17098b2f5267f16c295f12faab810527cd6311997e34Romain Guy addBounds(left, top, right, bottom); 17108b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPoint(startAngle, sweepAngle); 17118b2f5267f16c295f12faab810527cd6311997e34Romain Guy addInt(useCenter ? 1 : 0); 17128b2f5267f16c295f12faab810527cd6311997e34Romain Guy addPaint(paint); 1713486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17148b2f5267f16c295f12faab810527cd6311997e34Romain Guy} 17158b2f5267f16c295f12faab810527cd6311997e34Romain Guy 1716486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) { 171733f6beb10f98e8ba96250e284876d607055d278dRomain Guy float left, top, offset; 171833f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t width, height; 171933f6beb10f98e8ba96250e284876d607055d278dRomain Guy computePathBounds(path, paint, left, top, offset, width, height); 172033f6beb10f98e8ba96250e284876d607055d278dRomain Guy 172195c21d0546e36ade3e0601394f5b625541836545Romain Guy left -= offset; 172295c21d0546e36ade3e0601394f5b625541836545Romain Guy top -= offset; 172395c21d0546e36ade3e0601394f5b625541836545Romain Guy 172495c21d0546e36ade3e0601394f5b625541836545Romain Guy const bool reject = quickReject(left, top, left + width, top + height); 172533f6beb10f98e8ba96250e284876d607055d278dRomain Guy uint32_t* location = addOp(DisplayList::DrawPath, reject); 17264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPath(path); 17274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 172833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1729486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 17314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1732486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) { 1733b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::DrawLines); 17344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloats(points, count); 17354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPaint(paint); 1736486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1737ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy} 1738ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy 1739486590963e2207d68eebd6944fec70d50d41116aChet Haasestatus_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) { 1740ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addOp(DisplayList::DrawPoints); 1741ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addFloats(points, count); 1742ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy addPaint(paint); 1743486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 17444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 17454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1746996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count, 1747996e57c84368058be793897ebc355b917a59abc2Raph Levien SkPath* path, float hOffset, float vOffset, SkPaint* paint) { 1748996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 1749996e57c84368058be793897ebc355b917a59abc2Raph Levien addOp(DisplayList::DrawTextOnPath); 1750996e57c84368058be793897ebc355b917a59abc2Raph Levien addText(text, bytesCount); 1751996e57c84368058be793897ebc355b917a59abc2Raph Levien addInt(count); 1752996e57c84368058be793897ebc355b917a59abc2Raph Levien addPath(path); 1753996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(hOffset); 1754996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(vOffset); 1755996e57c84368058be793897ebc355b917a59abc2Raph Levien paint->setAntiAlias(true); 1756e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1757e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1758e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1759996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 1760996e57c84368058be793897ebc355b917a59abc2Raph Levien} 1761996e57c84368058be793897ebc355b917a59abc2Raph Levien 1762996e57c84368058be793897ebc355b917a59abc2Raph Levienstatus_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count, 1763996e57c84368058be793897ebc355b917a59abc2Raph Levien const float* positions, SkPaint* paint) { 1764996e57c84368058be793897ebc355b917a59abc2Raph Levien if (!text || count <= 0) return DrawGlInfo::kStatusDone; 1765996e57c84368058be793897ebc355b917a59abc2Raph Levien addOp(DisplayList::DrawPosText); 1766996e57c84368058be793897ebc355b917a59abc2Raph Levien addText(text, bytesCount); 1767996e57c84368058be793897ebc355b917a59abc2Raph Levien addInt(count); 1768996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloats(positions, count * 2); 1769996e57c84368058be793897ebc355b917a59abc2Raph Levien paint->setAntiAlias(true); 1770e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1771e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1772e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1773996e57c84368058be793897ebc355b917a59abc2Raph Levien return DrawGlInfo::kStatusDone; 1774996e57c84368058be793897ebc355b917a59abc2Raph Levien} 1775996e57c84368058be793897ebc355b917a59abc2Raph Levien 1776c25259519f1b74bb62a2b051b74537f073436b5cRomain Guystatus_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count, 1777996e57c84368058be793897ebc355b917a59abc2Raph Levien float x, float y, const float* positions, SkPaint* paint, float length) { 1778486590963e2207d68eebd6944fec70d50d41116aChet Haase if (!text || count <= 0) return DrawGlInfo::kStatusDone; 177933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 17808f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // TODO: We should probably make a copy of the paint instead of modifying 17818f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // it; modifying the paint will change its generationID the first 17828f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // time, which might impact caches. More investigation needed to 17838f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // see if it matters. 17848f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // If we make a copy, then drawTextDecorations() should *not* make 17858f9a9f61ab793d9387a5942b307e74324704893bRomain Guy // its own copy as it does right now. 1786c511bee87cda99a252d1a62487f47c8f05aee78cFabrice Di Meglio // Beware: this needs Glyph encoding (already done on the Paint constructor) 17878f9a9f61ab793d9387a5942b307e74324704893bRomain Guy paint->setAntiAlias(true); 178833f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (length < 0.0f) length = paint->measureText(text, bytesCount); 178933f6beb10f98e8ba96250e284876d607055d278dRomain Guy 179033f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool reject = false; 179133f6beb10f98e8ba96250e284876d607055d278dRomain Guy if (CC_LIKELY(paint->getTextAlign() == SkPaint::kLeft_Align)) { 179233f6beb10f98e8ba96250e284876d607055d278dRomain Guy SkPaint::FontMetrics metrics; 179333f6beb10f98e8ba96250e284876d607055d278dRomain Guy paint->getFontMetrics(&metrics, 0.0f); 179433f6beb10f98e8ba96250e284876d607055d278dRomain Guy reject = quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom); 179533f6beb10f98e8ba96250e284876d607055d278dRomain Guy } 179633f6beb10f98e8ba96250e284876d607055d278dRomain Guy 1797c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy uint32_t* location = addOp(DisplayList::DrawText, reject); 179833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addText(text, bytesCount); 179933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addInt(count); 1800996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(x); 1801996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloat(y); 1802996e57c84368058be793897ebc355b917a59abc2Raph Levien addFloats(positions, count * 2); 1803e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase SkPaint* addedPaint = addPaint(paint); 1804e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase if (!reject) { 1805e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase FontRenderer& fontRenderer = mCaches.fontRenderer->getFontRenderer(addedPaint); 1806e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase fontRenderer.precache(addedPaint, text, count); 1807e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase } 180833f6beb10f98e8ba96250e284876d607055d278dRomain Guy addFloat(length); 180933f6beb10f98e8ba96250e284876d607055d278dRomain Guy addSkip(location); 1810486590963e2207d68eebd6944fec70d50d41116aChet Haase return DrawGlInfo::kStatusDone; 1811eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy} 1812eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy 18134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShader() { 1814b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShader); 18154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShader(SkiaShader* shader) { 18185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addOp(DisplayList::SetupShader); 18195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase addShader(shader); 18204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetColorFilter() { 1823b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetColorFilter); 18244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) { 1827ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addOp(DisplayList::SetupColorFilter); 1828ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase addColorFilter(filter); 18294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::resetShadow() { 1832b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::ResetShadow); 18334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyvoid DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) { 1836b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy addOp(DisplayList::SetupShadow); 18374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addFloat(radius); 18384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addPoint(dx, dy); 18394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy addInt(color); 18404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy} 18414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 18425ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::resetPaintFilter() { 18435ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::ResetPaintFilter); 18445ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 18455ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 18465ff9df658230d49e42c43586997a02d8e4dd417eRomain Guyvoid DisplayListRenderer::setupPaintFilter(int clearBits, int setBits) { 18475ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addOp(DisplayList::SetupPaintFilter); 18485ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(clearBits); 18495ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy addInt(setBits); 18505ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy} 18515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 18524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 18534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 1854