DisplayListRenderer.h revision 796475006f5d670e8383a2050f11719522437a43
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
259c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
26113e0824d6bddf4376240681f9cf6a2deded9498John Reck#include "RenderNode.h"
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
35ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
38ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
43b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
46c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList;
47b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
482af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp;
492af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp;
502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp;
512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
52b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
53d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer.
54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
553b20251a355c88193c439f928a84ae69483fb488John Reckclass ANDROID_API DisplayListRenderer: public StatefulBaseRenderer {
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
573b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer();
587953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
603b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListData* finishRecording();
615977baa1fa24125c148a72699b53e62abaf08960Chet Haase
6214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Frame state operations
6414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
657c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
677953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
687953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
69daf98e941e140e8739458126640183b9f296a2abChet Haase
7014e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas state operations
7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save (layer)
747953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
757953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
777953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
78d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger            const SkPaint* paint, int flags);
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Matrix
813b20251a355c88193c439f928a84ae69483fb488John Reck    virtual void translate(float dx, float dy, float dz = 0.0f);
827953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
86139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void setMatrix(const SkMatrix& matrix);
87139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void concatMatrix(const SkMatrix& matrix);
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
91d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op);
92d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Misc - should be implemented with SkPaint inspection
9514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void resetPaintFilter();
9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void setupPaintFilter(int clearBits, int setBits);
9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
983b20251a355c88193c439f928a84ae69483fb488John Reck    bool isCurrentTransformSimple() {
993b20251a355c88193c439f928a84ae69483fb488John Reck        return currentTransform()->isSimple();
1003b20251a355c88193c439f928a84ae69483fb488John Reck    }
1013b20251a355c88193c439f928a84ae69483fb488John Reck
10214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations
10414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t drawColor(int color, SkXfermode::Mode mode);
10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik
10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Bitmap-based
108796475006f5d670e8383a2050f11719522437a43Chris Craik    virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint);
109d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
111d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float dstRight, float dstBottom, const SkPaint* paint);
112796475006f5d670e8383a2050f11719522437a43Chris Craik    virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint);
113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
114d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* vertices, const int* colors, const SkPaint* paint);
115d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
116d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float left, float top, float right, float bottom, const SkPaint* paint);
11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Shapes
119d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawRect(float left, float top, float right, float bottom,
120d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const SkPaint* paint);
121d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawRects(const float* rects, int count, const SkPaint* paint);
122486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawRoundRect(float left, float top, float right, float bottom,
123d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float rx, float ry, const SkPaint* paint);
124d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint);
12552244fff29042926e21fa897ef5ab11148e35299John Reck    virtual status_t drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
12652244fff29042926e21fa897ef5ab11148e35299John Reck                CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint);
127d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawOval(float left, float top, float right, float bottom,
128d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const SkPaint* paint);
129486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawArc(float left, float top, float right, float bottom,
130d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint);
131d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPath(const SkPath* path, const SkPaint* paint);
132d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawLines(const float* points, int count, const SkPaint* paint);
133d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPoints(const float* points, int count, const SkPaint* paint);
13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik
13514e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Text
13614e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
137d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
13814e513058ed4168c94e015638d16f5f87fd8063aChris Craik            DrawOpMode drawOpMode = kDrawOpMode_Immediate);
139d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
140d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float hOffset, float vOffset, const SkPaint* paint);
141486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawPosText(const char* text, int bytesCount, int count,
142d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* positions, const SkPaint* paint);
1434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
14514e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations - special
14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
14714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t drawLayer(Layer* layer, float x, float y);
148a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, int32_t replayFlags);
1494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // TODO: rename for consistency
15114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
1525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
153cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    void setHighContrastText(bool highContrastText) {
154cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        mHighContrastText = highContrastText;
155cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    }
1564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
1572af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    void insertRestoreToCount();
1582af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    void insertTranslate();
1594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    LinearAllocator& alloc() { return mDisplayListData->allocator; }
1612af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    void addStateOp(StateOp* op);
1620f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    void addDrawOp(DrawOp* op);
1632af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    void addOpInternal(DisplayListOp* op) {
16433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertRestoreToCount();
1652af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        insertTranslate();
1662af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        mDisplayListData->displayListOps.add(op);
1674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1692af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    template<class T>
170d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const T* refBuffer(const T* srcBuffer, int32_t count) {
171d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        if (!srcBuffer) return NULL;
172d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
1732af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T));
1742af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        memcpy(dstBuffer, srcBuffer, count * sizeof(T));
1752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return dstBuffer;
1764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1782af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    inline char* refText(const char* text, size_t byteLength) {
1792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength);
1804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
182d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPath* refPath(const SkPath* path) {
1832af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        if (!path) return NULL;
1842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
185d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPath* pathCopy = mPathMap.valueFor(path);
1862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
187d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            SkPath* newPathCopy = new SkPath(*path);
188d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            newPathCopy->setSourcePath(path);
189d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
190d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            pathCopy = newPathCopy;
19196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
19296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
19344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->paths.add(pathCopy);
1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
19544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        if (mDisplayListData->sourcePaths.indexOf(path) < 0) {
19658ecc204fbcacef34806290492384677a330d4d4Romain Guy            mCaches.resourceCache.incrementRefcount(path);
19744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->sourcePaths.add(path);
198d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        }
1992af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return pathCopy;
2004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
202d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPaint* refPaint(const SkPaint* paint) {
203cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        if (!paint) return NULL;
2040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
205d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPaint* paintCopy = mPaintMap.valueFor(paint);
206d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
207d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
20896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
20996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPaintMap.replaceValueFor(paint, paintCopy);
21044fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->paints.add(paintCopy);
211d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
2120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
213e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        return paintCopy;
2140fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
2150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
216cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    inline SkPaint* copyPaint(const SkPaint* paint) {
217cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        if (!paint) return NULL;
218cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        SkPaint* paintCopy = new SkPaint(*paint);
219cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        mDisplayListData->paints.add(paintCopy);
220cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
221cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        return paintCopy;
222cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    }
223cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
224d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkRegion* refRegion(const SkRegion* region) {
225735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        if (!region) {
226735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            return region;
227735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
228735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
229d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkRegion* regionCopy = mRegionMap.valueFor(region);
230735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        // TODO: Add generation ID to SkRegion
231735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        if (regionCopy == NULL) {
232735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            regionCopy = new SkRegion(*region);
233735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            // replaceValueFor() performs an add if the entry doesn't exist
234735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            mRegionMap.replaceValueFor(region, regionCopy);
23544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->regions.add(regionCopy);
236735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
237735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
238735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        return regionCopy;
239735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    }
240735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
241ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy    inline Layer* refLayer(Layer* layer) {
24244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->layers.add(layer);
243ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy        mCaches.resourceCache.incrementRefcount(layer);
244ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy        return layer;
245ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy    }
246ce4a7dfc516ee61301e9af91fad17ca1320efaabRomain Guy
247d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkBitmap* refBitmap(const SkBitmap* bitmap) {
248d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
249d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
250d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
251d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
25244fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->bitmapResources.add(bitmap);
25358ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.incrementRefcount(bitmap);
2542af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return bitmap;
2555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
257d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) {
25844fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->ownedBitmapResources.add(bitmap);
25958ecc204fbcacef34806290492384677a330d4d4Romain Guy        mCaches.resourceCache.incrementRefcount(bitmap);
2602af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return bitmap;
26149c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
26249c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
263d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
26444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->patchResources.add(patch);
265e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        mCaches.resourceCache.incrementRefcount(patch);
266e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        return patch;
267e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
268e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
269d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkPaint*, const SkPaint*> mPaintMap;
270d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap;
271d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap;
27224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
27358ecc204fbcacef34806290492384677a330d4d4Romain Guy    Caches& mCaches;
27444fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    DisplayListData* mDisplayListData;
27558ecc204fbcacef34806290492384677a330d4d4Romain Guy
27633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
27733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
27833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool mHasTranslate;
279cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    bool mHighContrastText;
28054c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
281eea6ef9c767c734797912022113191dd255c4ae6Chris Craik    int mRestoreSaveCount;
282eea6ef9c767c734797912022113191dd255c4ae6Chris Craik
283e18264b079481a244b30e3f71012c53bbd861f92John Reck    friend class RenderNode;
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
291