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