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 <SkMatrix.h> 214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h> 224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h> 237953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h> 247953745dd565167113f8cbfc461bc0521d32d870Romain Guy 250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "DisplayList.h" 269c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h" 274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h" 284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android { 304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer { 314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines 344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 366d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096 3733f6beb10f98e8ba96250e284876d607055d278dRomain Guy#define OP_MAY_BE_SKIPPED_MASK 0xff000000 384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug 40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST 415baa3a62a97544669fba6d65a11c07f252e654ddSteve Block #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__) 42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else 43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy #define DISPLAY_LIST_LOGD(...) 44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif 45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy 464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 47b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list 484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/////////////////////////////////////////////////////////////////////////////// 494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 50c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList; 51b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer; 522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp; 532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp; 542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp; 552af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik 56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/** 57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback. 58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */ 59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer { 60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic: 617953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayListRenderer(); 627953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual ~DisplayListRenderer(); 63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 647953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API DisplayList* getDisplayList(DisplayList* displayList); 655977baa1fa24125c148a72699b53e62abaf08960Chet Haase 6649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy virtual bool isDeferred(); 6749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 687953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setViewport(int width, int height); 697c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque); 707953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void finish(); 71b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 726554943a1dd6854c0f4976900956e556767b49e1Romain Guy virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty); 734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 747953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void interrupt(); 757953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resume(); 76daf98e941e140e8739458126640183b9f296a2abChet Haase 777953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int save(int flags); 787953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restore(); 797953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void restoreToCount(int saveCount); 804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 817953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual int saveLayer(float left, float top, float right, float bottom, 82ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik int alpha, SkXfermode::Mode mode, int flags); 834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 847953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void translate(float dx, float dy); 857953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void rotate(float degrees); 867953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void scale(float sx, float sy); 877953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void skew(float sx, float sy); 884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 897953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setMatrix(SkMatrix* matrix); 907953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void concatMatrix(SkMatrix* matrix); 914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 927953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op); 93735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy virtual bool clipPath(SkPath* path, SkRegion::Op op); 94735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy virtual bool clipRegion(SkRegion* region, SkRegion::Op op); 954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 96c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags); 97a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik virtual status_t drawLayer(Layer* layer, float x, float y); 98486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint); 99486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint); 100486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop, 1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy float srcRight, float srcBottom, float dstLeft, float dstTop, 1025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float dstRight, float dstBottom, SkPaint* paint); 103486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint); 104486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight, 1055a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy float* vertices, int* colors, SkPaint* paint); 106486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs, 1074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors, 1085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 109486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawColor(int color, SkXfermode::Mode mode); 110486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint); 111486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRoundRect(float left, float top, float right, float bottom, 11201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 113486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint); 114486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint); 115486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawArc(float left, float top, float right, float bottom, 1168b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 117486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPath(SkPath* path, SkPaint* paint); 118486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawLines(float* points, int count, SkPaint* paint); 119486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPoints(float* points, int count, SkPaint* paint); 120486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 121325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset, float vOffset, SkPaint* paint); 122486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPosText(const char* text, int bytesCount, int count, 123486590963e2207d68eebd6944fec70d50d41116aChet Haase const float* positions, SkPaint* paint); 124527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 125527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik const float* positions, SkPaint* paint, float length, DrawOpMode drawOpMode); 126527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik 127672433d90fab7383cd28beac9d4485b566a90940Romain Guy virtual status_t drawRects(const float* rects, int count, SkPaint* paint); 1284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1297953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShader(); 1307953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShader(SkiaShader* shader); 1314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1327953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetColorFilter(); 1337953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupColorFilter(SkiaColorFilter* filter); 1344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1357953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void resetShadow(); 1367953745dd565167113f8cbfc461bc0521d32d870Romain Guy virtual void setupShadow(float radius, float dx, float dy, int color); 1374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1385ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void resetPaintFilter(); 1395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy virtual void setupPaintFilter(int clearBits, int setBits); 1405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy 1417953745dd565167113f8cbfc461bc0521d32d870Romain Guy ANDROID_API void reset(); 1424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik sp<DisplayListData> getDisplayListData() const { 1442af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return mDisplayListData; 145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase const Vector<SkBitmap*>& getBitmapResources() const { 1485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase return mBitmapResources; 149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 15149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy const Vector<SkBitmap*>& getOwnedBitmapResources() const { 15249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy return mOwnedBitmapResources; 15349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 15449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 155d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy const Vector<SkiaColorFilter*>& getFilterResources() const { 156d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy return mFilterResources; 157d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy } 158d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy 15924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 16024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 163d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 164d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 1655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 1682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 1692fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 1702fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 171d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase const SortedVector<SkPath*>& getSourcePaths() const { 172d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase return mSourcePaths; 173d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 174d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 175735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy const Vector<SkRegion*>& getRegions() const { 176735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return mRegions; 177735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 178735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 179603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase const Vector<Layer*>& getLayers() const { 180603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase return mLayers; 181603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 182603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 183d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 184d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 18754c1a64d5441a964890b44280e4457e11f4f924aRomain Guy uint32_t getFunctorCount() const { 18854c1a64d5441a964890b44280e4457e11f4f924aRomain Guy return mFunctorCount; 18954c1a64d5441a964890b44280e4457e11f4f924aRomain Guy } 19054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 1914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 1922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertRestoreToCount(); 1932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertTranslate(); 1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik LinearAllocator& alloc() { return mDisplayListData->allocator; } 1962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addStateOp(StateOp* op); 1970f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy void addDrawOp(DrawOp* op); 1982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addOpInternal(DisplayListOp* op) { 19933f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 2002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData->displayListOps.add(op); 2024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik template<class T> 2052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline T* refBuffer(const T* srcBuffer, int32_t count) { 2062af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (srcBuffer == NULL) return NULL; 2072af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); 2082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 2092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return dstBuffer; 2104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline char* refText(const char* text, size_t byteLength) { 2132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkPath* refPath(SkPath* path) { 2172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!path) return NULL; 2182fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 2192fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 2202fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 221b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 2224bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy pathCopy->setSourcePath(path); 22396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 22496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 225b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 227d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase if (mSourcePaths.indexOf(path) < 0) { 22858ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(path); 229d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.add(path); 230d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 2312af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return pathCopy; 2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2342af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkPaint* refPaint(SkPaint* paint) { 23524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 236e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paint; 237d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2380fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 23922d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 240d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 241d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 24296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 24396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 244d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 245d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 247e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paintCopy; 2480fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2490fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 2502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkRegion* refRegion(SkRegion* region) { 251735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (!region) { 252735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return region; 253735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 254735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 255735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy SkRegion* regionCopy = mRegionMap.valueFor(region); 256735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // TODO: Add generation ID to SkRegion 257735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (regionCopy == NULL) { 258735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy regionCopy = new SkRegion(*region); 259735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // replaceValueFor() performs an add if the entry doesn't exist 260735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegionMap.replaceValueFor(region, regionCopy); 261735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegions.add(regionCopy); 262735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 263735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 264735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return regionCopy; 265735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 266735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 2672af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkMatrix* refMatrix(SkMatrix* matrix) { 268d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Copying the matrix is cheap and prevents against the user changing the original 269d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // matrix before the operation that uses it 270f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 271f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy mMatrices.add(copy); 2722af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return copy; 2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 275ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy inline Layer* refLayer(Layer* layer) { 276ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy mLayers.add(layer); 277ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy mCaches.resourceCache.incrementRefcount(layer); 278ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy return layer; 279ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy } 280ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy 2812af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkBitmap* refBitmap(SkBitmap* bitmap) { 282d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 283d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 284d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 285d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 2865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 28758ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 2882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 2895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkBitmap* refBitmapData(SkBitmap* bitmap) { 29249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy mOwnedBitmapResources.add(bitmap); 29358ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 2942af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 29549c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 29649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 2972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkiaShader* refShader(SkiaShader* shader) { 2982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!shader) return NULL; 29924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 30024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 30124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 3021f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 30324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 30496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 30596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mShaderMap.replaceValueFor(shader, shaderCopy); 3061f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 30758ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(shaderCopy); 30824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 3092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return shaderCopy; 3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkiaColorFilter* refColorFilter(SkiaColorFilter* colorFilter) { 313ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 31458ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(colorFilter); 3152af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return colorFilter; 316ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 317ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 3185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 31949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy Vector<SkBitmap*> mOwnedBitmapResources; 320ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 322d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 3230fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 32424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 3252fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 3262fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 3272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 328d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase SortedVector<SkPath*> mSourcePaths; 329d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 330735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy Vector<SkRegion*> mRegions; 331735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy DefaultKeyedVector<SkRegion*, SkRegion*> mRegionMap; 332735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 33324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 33424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 33524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 336d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 337d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 338603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase Vector<Layer*> mLayers; 339603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 34027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 34133f6beb10f98e8ba96250e284876d607055d278dRomain Guy 34258ecc204fbcacef34806290492384677a330d4d4Romain Guy Caches& mCaches; 3432af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik sp<DisplayListData> mDisplayListData; 34458ecc204fbcacef34806290492384677a330d4d4Romain Guy 34533f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 34633f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 34733f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 34804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 34927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 35054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy uint32_t mFunctorCount; 35154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 352b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 353b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3595b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 360