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); 1063b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy virtual status_t drawPatch(SkBitmap* bitmap, Res_png_9patch* patch, 1075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase float left, float top, float right, float bottom, SkPaint* paint); 108486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawColor(int color, SkXfermode::Mode mode); 109486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint); 110486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawRoundRect(float left, float top, float right, float bottom, 11101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy float rx, float ry, SkPaint* paint); 112486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint); 113486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint); 114486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawArc(float left, float top, float right, float bottom, 1158b2f5267f16c295f12faab810527cd6311997e34Romain Guy float startAngle, float sweepAngle, bool useCenter, SkPaint* paint); 116486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPath(SkPath* path, SkPaint* paint); 117486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawLines(float* points, int count, SkPaint* paint); 118486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPoints(float* points, int count, SkPaint* paint); 119486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path, 120325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy float hOffset, float vOffset, SkPaint* paint); 121486590963e2207d68eebd6944fec70d50d41116aChet Haase virtual status_t drawPosText(const char* text, int bytesCount, int count, 122486590963e2207d68eebd6944fec70d50d41116aChet Haase const float* positions, SkPaint* paint); 123527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y, 12441541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds, 12541541825bc90dac740e424cdd41a8c997e15cdb7Chris Craik 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 159e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy const Vector<Res_png_9patch*>& getPatchResources() const { 160e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return mPatchResources; 161e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 162e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 16324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy const Vector<SkiaShader*>& getShaders() const { 16424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy return mShaders; 165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 167d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkPaint*>& getPaints() const { 168d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mPaints; 1695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 1705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase 1712fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy const Vector<SkPath*>& getPaths() const { 1722fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy return mPaths; 1732fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy } 1742fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 175d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase const SortedVector<SkPath*>& getSourcePaths() const { 176d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase return mSourcePaths; 177d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 178d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 179735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy const Vector<SkRegion*>& getRegions() const { 180735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return mRegions; 181735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 182735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 183603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase const Vector<Layer*>& getLayers() const { 184603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase return mLayers; 185603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase } 186603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 187d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase const Vector<SkMatrix*>& getMatrices() const { 188d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase return mMatrices; 189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy } 190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 19154c1a64d5441a964890b44280e4457e11f4f924aRomain Guy uint32_t getFunctorCount() const { 19254c1a64d5441a964890b44280e4457e11f4f924aRomain Guy return mFunctorCount; 19354c1a64d5441a964890b44280e4457e11f4f924aRomain Guy } 19454c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate: 1962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertRestoreToCount(); 1972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void insertTranslate(); 1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik LinearAllocator& alloc() { return mDisplayListData->allocator; } 2002af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addStateOp(StateOp* op); 2010f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy void addDrawOp(DrawOp* op); 2022af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik void addOpInternal(DisplayListOp* op) { 20333f6beb10f98e8ba96250e284876d607055d278dRomain Guy insertRestoreToCount(); 2042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik insertTranslate(); 2052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik mDisplayListData->displayListOps.add(op); 2064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2082af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik template<class T> 2092af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline T* refBuffer(const T* srcBuffer, int32_t count) { 2102af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (srcBuffer == NULL) return NULL; 2112af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T)); 2122af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik memcpy(dstBuffer, srcBuffer, count * sizeof(T)); 2132af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return dstBuffer; 2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline char* refText(const char* text, size_t byteLength) { 2172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength); 2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2202af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkPath* refPath(SkPath* path) { 2212af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!path) return NULL; 2222fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 2232fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy SkPath* pathCopy = mPathMap.valueFor(path); 2242fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) { 225b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy pathCopy = new SkPath(*path); 2264bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy pathCopy->setSourcePath(path); 22796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 22896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPathMap.replaceValueFor(path, pathCopy); 229b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy mPaths.add(pathCopy); 2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 231d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase if (mSourcePaths.indexOf(path) < 0) { 23258ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(path); 233d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase mSourcePaths.add(path); 234d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase } 2352af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return pathCopy; 2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2382af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkPaint* refPaint(SkPaint* paint) { 23924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy if (!paint) { 240e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paint; 241d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2420fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 24322d418437e44587cb0fba4353515719453269189Romain Guy SkPaint* paintCopy = mPaintMap.valueFor(paint); 244d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) { 245d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase paintCopy = new SkPaint(*paint); 24696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 24796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mPaintMap.replaceValueFor(paint, paintCopy); 248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase mPaints.add(paintCopy); 249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase } 2500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 251e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase return paintCopy; 2520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy } 2530fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy 2542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkRegion* refRegion(SkRegion* region) { 255735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (!region) { 256735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return region; 257735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 258735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 259735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy SkRegion* regionCopy = mRegionMap.valueFor(region); 260735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // TODO: Add generation ID to SkRegion 261735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy if (regionCopy == NULL) { 262735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy regionCopy = new SkRegion(*region); 263735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy // replaceValueFor() performs an add if the entry doesn't exist 264735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegionMap.replaceValueFor(region, regionCopy); 265735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy mRegions.add(regionCopy); 266735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 267735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 268735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy return regionCopy; 269735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy } 270735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 2712af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkMatrix* refMatrix(SkMatrix* matrix) { 2724e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy if (matrix) { 2734e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy // Copying the matrix is cheap and prevents against the user changing 2744e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy // the original matrix before the operation that uses it 2754e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy SkMatrix* copy = new SkMatrix(*matrix); 2764e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy mMatrices.add(copy); 2774e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy return copy; 2784e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy } 2794e7b772b733593fbe25c733e95b8dcea293234b6Romain Guy return matrix; 2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 282ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy inline Layer* refLayer(Layer* layer) { 283ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy mLayers.add(layer); 284ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy mCaches.resourceCache.incrementRefcount(layer); 285ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy return layer; 286ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy } 287ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy 2882af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkBitmap* refBitmap(SkBitmap* bitmap) { 289d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // Note that this assumes the bitmap is immutable. There are cases this won't handle 290d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // correctly, such as creating the bitmap from scratch, drawing with it, changing its 291d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // contents, and drawing again. The only fix would be to always copy it the first time, 292d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase // which doesn't seem worth the extra cycles for this unlikely case. 2935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase mBitmapResources.add(bitmap); 29458ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 2952af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 2965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase } 2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 2982af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkBitmap* refBitmapData(SkBitmap* bitmap) { 29949c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy mOwnedBitmapResources.add(bitmap); 30058ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(bitmap); 3012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return bitmap; 30249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy } 30349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy 3042af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkiaShader* refShader(SkiaShader* shader) { 3052af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik if (!shader) return NULL; 30624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 30724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy SkiaShader* shaderCopy = mShaderMap.valueFor(shader); 30824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy // TODO: We also need to handle generation ID changes in compose shaders 3091f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) { 31024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy shaderCopy = shader->copy(); 31196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy // replaceValueFor() performs an add if the entry doesn't exist 31296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy mShaderMap.replaceValueFor(shader, shaderCopy); 3131f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy mShaders.add(shaderCopy); 31458ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(shaderCopy); 31524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy } 3162af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return shaderCopy; 3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy } 3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3192af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik inline SkiaColorFilter* refColorFilter(SkiaColorFilter* colorFilter) { 320ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase mFilterResources.add(colorFilter); 32158ecc204fbcacef34806290492384677a330d4d4Romain Guy mCaches.resourceCache.incrementRefcount(colorFilter); 3222af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik return colorFilter; 323ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase } 324ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase 325e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy inline Res_png_9patch* refPatch(Res_png_9patch* patch) { 326e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy mPatchResources.add(patch); 327e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy mCaches.resourceCache.incrementRefcount(patch); 328e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy return patch; 329e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy } 330e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy 3315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase Vector<SkBitmap*> mBitmapResources; 33249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy Vector<SkBitmap*> mOwnedBitmapResources; 333ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase Vector<SkiaColorFilter*> mFilterResources; 334e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy Vector<Res_png_9patch*> mPatchResources; 3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 336d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkPaint*> mPaints; 3370fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap; 33824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 3392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy Vector<SkPath*> mPaths; 3402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy DefaultKeyedVector<SkPath*, SkPath*> mPathMap; 3412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy 342d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase SortedVector<SkPath*> mSourcePaths; 343d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase 344735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy Vector<SkRegion*> mRegions; 345735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy DefaultKeyedVector<SkRegion*, SkRegion*> mRegionMap; 346735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy 34724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy Vector<SkiaShader*> mShaders; 34824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap; 34924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy 350d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase Vector<SkMatrix*> mMatrices; 351d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase 352603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase Vector<Layer*> mLayers; 353603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 35427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy int mRestoreSaveCount; 35533f6beb10f98e8ba96250e284876d607055d278dRomain Guy 35658ecc204fbcacef34806290492384677a330d4d4Romain Guy Caches& mCaches; 3572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik sp<DisplayListData> mDisplayListData; 35858ecc204fbcacef34806290492384677a330d4d4Romain Guy 35933f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateX; 36033f6beb10f98e8ba96250e284876d607055d278dRomain Guy float mTranslateY; 36133f6beb10f98e8ba96250e284876d607055d278dRomain Guy bool mHasTranslate; 36204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy bool mHasDrawOps; 36327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy 36454c1a64d5441a964890b44280e4457e11f4f924aRomain Guy uint32_t mFunctorCount; 36554c1a64d5441a964890b44280e4457e11f4f924aRomain Guy 366b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy friend class DisplayList; 367b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy 3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer 3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer 3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android 3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy 3735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H 374