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