DisplayListRenderer.h revision 13631f3da855f200a151e7837ed9f6b079622b58
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 175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h> 234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h> 264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h> 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h> 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 297953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 307953745dd565167113f8cbfc461bc0521d32d870Romain Guy 3113631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <utils/String8.h> 3213631f3da855f200a151e7837ed9f6b079622b58Romain Guy 339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h" 357d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.h" 364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 446d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096 454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/** 60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands. 614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */ 62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList { 634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic: 64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy DisplayList(const DisplayListRenderer& recorder); 657953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API ~DisplayList(); 664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file 68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy // when modifying this file 694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy enum Op { 7004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Non-drawing operations 712b1847ea60650a9f68372abe860415f18b55081dRomain Guy Save = 0, 724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Restore, 734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy RestoreToCount, 744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SaveLayer, 755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy SaveLayerAlpha, 764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Translate, 774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Rotate, 784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy Scale, 79807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy Skew, 804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetMatrix, 814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ConcatMatrix, 824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ClipRect, 8304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy // Drawing operations 840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DrawDisplayList, 856c319ca1275c8db892c39b48fc54864c949f9171Romain Guy DrawLayer, 864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmap, 874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapMatrix, 884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawBitmapRect, 895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy DrawBitmapMesh, 904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPatch, 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawColor, 924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawRect, 9301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawRoundRect, 9401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy DrawCircle, 95c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy DrawOval, 968b2f5267f16c295f12faab810527cd6311997e34Romain Guy DrawArc, 974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawPath, 984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawLines, 99ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy DrawPoints, 1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy DrawText, 101eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy DrawPosText, 1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShader, 1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupShader, 1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetColorFilter, 1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SetupColorFilter, 1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy ResetShadow, 107ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy SetupShadow, 1085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy ResetPaintFilter, 1095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SetupPaintFilter, 110daf98e941e140e8739458126640183b9f296a2abChet Haase DrawGLFunction, 1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy }; 1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy static const char* OP_NAMES[]; 114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 115d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false); 1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase 1177953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API size_t getSize(); 11865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 119cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0); 120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 121ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase void output(OpenGLRenderer& renderer, uint32_t level = 0); 122ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase 1237953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API static void outputLogBuffer(int fd); 1249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase 12504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy void setRenderable(bool renderable) { 12604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mIsRenderable = renderable; 12704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 12804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 12904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool isRenderable() const { 13004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy return mIsRenderable; 13104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy } 13204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 13313631f3da855f200a151e7837ed9f6b079622b58Romain Guy void setName(const char* name) { 13413631f3da855f200a151e7837ed9f6b079622b58Romain Guy if (name) { 13513631f3da855f200a151e7837ed9f6b079622b58Romain Guy mName.setTo(name); 13613631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 13713631f3da855f200a151e7837ed9f6b079622b58Romain Guy } 13813631f3da855f200a151e7837ed9f6b079622b58Romain Guy 139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate: 140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void init(); 141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 142d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase void clearResources(); 143d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase 144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy class TextContainer { 145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy public: 146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length() const { 147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mByteLength; 148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* text() const { 151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (const char*) mText; 152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t mByteLength; 155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const char* mText; 156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy }; 157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkBitmap* getBitmap() { 1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkBitmap*) getInt(); 1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkiaShader* getShader() { 1635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkiaShader*) getInt(); 164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 166ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase SkiaColorFilter* getColorFilter() { 167ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase return (SkiaColorFilter*) getInt(); 168ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 169ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline int getIndex() { 171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline int getInt() { 175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readInt(); 176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1787b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline uint32_t getUInt() { 1797b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy return mReader.readU32(); 1807b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 1817b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkMatrix* getMatrix() { 1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return (SkMatrix*) getInt(); 184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy SkPath* getPath() { 1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return (SkPath*) getInt(); 188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy SkPaint* getPaint(OpenGLRenderer& renderer) { 1915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy return renderer.filterPaint((SkPaint*) getInt()); 192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DisplayList* getDisplayList() { 1950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy return (DisplayList*) getInt(); 1960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 1970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline float getFloat() { 199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mReader.readScalar(); 200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy int32_t* getInts(uint32_t& count) { 203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (int32_t*) mReader.skip(count * sizeof(int32_t)); 205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy uint32_t* getUInts(int8_t& count) { 2084bb942083a0d4db746adf95349108dd8ef842e32Romain Guy count = getInt(); 2094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy return (uint32_t*) mReader.skip(count * sizeof(uint32_t)); 2104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 2114bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy float* getFloats(int& count) { 213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy count = getInt(); 214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return (float*) mReader.skip(count * sizeof(float)); 215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy void getText(TextContainer* text) { 218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy size_t length = text->mByteLength = getInt(); 219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy text->mText = (const char*) mReader.skip(length); 220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 223ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 225d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 2262fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 227d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 22824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 229d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mutable SkFlattenableReadBuffer mReader; 23165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy 23265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy size_t mSize; 23304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy 23404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mIsRenderable; 23513631f3da855f200a151e7837ed9f6b079622b58Romain Guy 23613631f3da855f200a151e7837ed9f6b079622b58Romain Guy String8 mName; 237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy}; 238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer 241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/////////////////////////////////////////////////////////////////////////////// 242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 2487953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayListRenderer(); 2497953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2517953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); 2525977baa1fa24125c148a72699b53e62abaf08960Chet Haase 2537953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setViewport(int width, int height); 2547953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque); 2557953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 2577953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool callDrawGLFunction(Functor *functor, Rect& dirty); 2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2597953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 2607953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 261daf98e941e140e8739458126640183b9f296a2abChet Haase 2627953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 2637953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 2647953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2667953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 2675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase SkPaint* p, int flags); 2687953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayerAlpha(float left, float top, float right, float bottom, 2695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy int alpha, int flags); 2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2717953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void translate(float dx, float dy); 2727953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 2737953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 2747953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2767953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setMatrix(SkMatrix* matrix); 2777953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void concatMatrix(SkMatrix* matrix); 2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2817953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height, 2827b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy Rect& dirty, uint32_t level = 0); 2837953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint); 2847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 2857953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 2867953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 2885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 2897953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 2905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint); 2917953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 2924bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 2935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 2947953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawColor(int color, SkXfermode::Mode mode); 2957953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint); 2967953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawRoundRect(float left, float top, float right, float bottom, 29701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 2987953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawCircle(float x, float y, float radius, SkPaint* paint); 2997953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint); 3007953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawArc(float left, float top, float right, float bottom, 3018b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 3027953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPath(SkPath* path, SkPaint* paint); 3037953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawLines(float* points, int count, SkPaint* paint); 3047953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawPoints(float* points, int count, SkPaint* paint); 3057953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void drawText(const char* text, int bytesCount, int count, float x, float y, 3068f9a9f61ab793d9387a5942b307e74324704893bRomain Guy SkPaint* paint, float length = 1.0f); 307eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions, 308eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy SkPaint* paint); 3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3107953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShader(); 3117953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShader(SkiaShader* shader); 3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3137953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetColorFilter(); 3147953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupColorFilter(SkiaColorFilter* filter); 3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3167953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShadow(); 3177953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShadow(float radius, float dx, float dy, int color); 3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void resetPaintFilter(); 3205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void setupPaintFilter(int clearBits, int setBits); 3215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 3227953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API void reset(); 3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy const SkWriter32& writeStream() const { 325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy return mWriter; 326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 3295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 332d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*>& getFilterResources() const { 333d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy return mFilterResources; 334d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 335d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 33624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 33724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 340d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 341d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 3425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 3442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 3452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 3462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 3472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 348d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 35327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy void insertRestoreToCount() { 35427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy if (mRestoreSaveCount >= 0) { 35527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mWriter.writeInt(DisplayList::RestoreToCount); 35627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy addInt(mRestoreSaveCount); 35727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy mRestoreSaveCount = -1; 35827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 35927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy } 36027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy inline void addOp(DisplayList::Op drawOp) { 36227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy insertRestoreToCount(); 3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(drawOp); 36404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList; 3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addInt(int value) { 3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(value); 3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3717b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy inline void addSize(uint32_t w, uint32_t h) { 3727b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(w); 3737b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy mWriter.writeInt(h); 3747b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy } 3757b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy 3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addInts(const int32_t* values, uint32_t count) { 377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (uint32_t i = 0; i < count; i++) { 3794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(values[i]); 3804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 3814bb942083a0d4db746adf95349108dd8ef842e32Romain Guy } 3824bb942083a0d4db746adf95349108dd8ef842e32Romain Guy 3834bb942083a0d4db746adf95349108dd8ef842e32Romain Guy void addUInts(const uint32_t* values, int8_t count) { 3844bb942083a0d4db746adf95349108dd8ef842e32Romain Guy mWriter.writeInt(count); 3854bb942083a0d4db746adf95349108dd8ef842e32Romain Guy for (int8_t i = 0; i < count; i++) { 3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(values[i]); 3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addFloat(float value) { 3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(value); 3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy void addFloats(const float* values, int count) { 395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy mWriter.writeInt(count); 3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy for (int i = 0; i < count; i++) { 3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(values[i]); 3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addPoint(float x, float y) { 4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(x); 4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(y); 4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addBounds(float left, float top, float right, float bottom) { 4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(left); 4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(top); 4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(right); 4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeScalar(bottom); 4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy inline void addText(const void* text, size_t byteLength) { 4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writeInt(byteLength); 4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy mWriter.writePad(text, byteLength); 4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4182fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy inline void addPath(SkPath* path) { 4192fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (!path) { 4202fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) NULL); 4212fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return; 4222fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 4232fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 4242fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 4252fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 426b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 4272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy mPathMap.add(path, pathCopy); 428b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 4312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy addInt((int) pathCopy); 4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addPaint(SkPaint* paint) { 43524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 4360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) NULL); 437d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return; 438d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 4390fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 44022d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 441d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 442d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 443d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaintMap.add(paint, paintCopy); 444d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 445d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 4460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 4470fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) paintCopy); 4480fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 4490fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 4500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy inline void addDisplayList(DisplayList* displayList) { 4510fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // TODO: To be safe, the display list should be ref-counted in the 4520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // resources cache, but we rely on the caller (UI toolkit) to 4530fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy // do the right thing for now 4540fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) displayList); 4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addMatrix(SkMatrix* matrix) { 458d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 459d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 460f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 461f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy addInt((int) copy); 462f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy mMatrices.add(copy); 4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addBitmap(SkBitmap* bitmap) { 466d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 467d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 468d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 469d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 4700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) bitmap); 4715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 472d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(bitmap); 4735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 4755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase inline void addShader(SkiaShader* shader) { 47624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!shader) { 47724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) NULL); 47824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return; 47924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 48024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 48124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 48224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 4831f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 48424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 48524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy mShaderMap.add(shader, shaderCopy); 4861f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 48743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy Caches::getInstance().resourceCache.incrementRefcount(shaderCopy); 48824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 48924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 49024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy addInt((int) shaderCopy); 4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 493ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase inline void addColorFilter(SkiaColorFilter* colorFilter) { 4940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy addInt((int) colorFilter); 495ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 496d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy Caches::getInstance().resourceCache.incrementRefcount(colorFilter); 497ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 498ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 4995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 500ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 502d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 5030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 50424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 5052fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 5062fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 5072fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 50824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 50924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 51024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 511d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 512d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy SkWriter32 mWriter; 5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 51527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 51604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 51727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 518b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 5255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 526