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"
27a35778c799e8073a42b9e22191bde9d838327ab7John Reck#include "ResourceCache.h"
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
36ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
37ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
385baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
39ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
40ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
44b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
47c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList;
4812f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reckclass DeferredLayerUpdater;
49b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
502af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DisplayListOp;
512af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass DrawOp;
522af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craikclass StateOp;
532af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik
54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
55d6b65f67717025b1162f86f04e2caa5723566cacChris Craik * Records drawing commands in a display list for later playback into an OpenGLRenderer.
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
573b20251a355c88193c439f928a84ae69483fb488John Reckclass ANDROID_API DisplayListRenderer: public StatefulBaseRenderer {
58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
593b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListRenderer();
607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
61b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
628afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void insertReorderBarrier(bool enableReorder);
638afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
643b20251a355c88193c439f928a84ae69483fb488John Reck    DisplayListData* finishRecording();
655977baa1fa24125c148a72699b53e62abaf08960Chet Haase
6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Frame state operations
6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
697c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
727953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
73daf98e941e140e8739458126640183b9f296a2abChet Haase
7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas state operations
7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Save (layer)
787953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
797953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
807953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
82d44fbe55a9f434cb5bb0e34c143ba1445141990dDerek Sollenberger            const SkPaint* paint, int flags);
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Matrix
853b20251a355c88193c439f928a84ae69483fb488John Reck    virtual void translate(float dx, float dy, float dz = 0.0f);
867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
877953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
887953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
90139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void setMatrix(const SkMatrix& matrix);
91139088228faa7f3c446af7387e017933998a5570Derek Sollenberger    virtual void concatMatrix(const SkMatrix& matrix);
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Clip
947953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
95d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipPath(const SkPath* path, SkRegion::Op op);
96d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual bool clipRegion(const SkRegion* region, SkRegion::Op op);
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Misc - should be implemented with SkPaint inspection
9914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void resetPaintFilter();
10014e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual void setupPaintFilter(int clearBits, int setBits);
10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
1023b20251a355c88193c439f928a84ae69483fb488John Reck    bool isCurrentTransformSimple() {
1033b20251a355c88193c439f928a84ae69483fb488John Reck        return currentTransform()->isSimple();
1043b20251a355c88193c439f928a84ae69483fb488John Reck    }
1053b20251a355c88193c439f928a84ae69483fb488John Reck
10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations
10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t drawColor(int color, SkXfermode::Mode mode);
11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik
11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Bitmap-based
112796475006f5d670e8383a2050f11719522437a43Chris Craik    virtual status_t drawBitmap(const SkBitmap* bitmap, const SkPaint* paint);
113d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawBitmap(const SkBitmap* bitmap, float srcLeft, float srcTop,
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
115d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float dstRight, float dstBottom, const SkPaint* paint);
116796475006f5d670e8383a2050f11719522437a43Chris Craik    virtual status_t drawBitmapData(const SkBitmap* bitmap, const SkPaint* paint);
117d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawBitmapMesh(const SkBitmap* bitmap, int meshWidth, int meshHeight,
118d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* vertices, const int* colors, const SkPaint* paint);
119d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPatch(const SkBitmap* bitmap, const Res_png_9patch* patch,
120d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float left, float top, float right, float bottom, const SkPaint* paint);
12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik
12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Shapes
123d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawRect(float left, float top, float right, float bottom,
124d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const SkPaint* paint);
125d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawRects(const float* rects, int count, const SkPaint* paint);
126486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawRoundRect(float left, float top, float right, float bottom,
127d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float rx, float ry, const SkPaint* paint);
128072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi    virtual status_t drawRoundRect(CanvasPropertyPrimitive* left, CanvasPropertyPrimitive* top,
129072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPrimitive* right, CanvasPropertyPrimitive* bottom,
130072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPrimitive* rx, CanvasPropertyPrimitive* ry,
131072707dfad1da6f49f4d3ce58ca104f6c46a7266Jorim Jaggi                CanvasPropertyPaint* paint);
132d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawCircle(float x, float y, float radius, const SkPaint* paint);
13352244fff29042926e21fa897ef5ab11148e35299John Reck    virtual status_t drawCircle(CanvasPropertyPrimitive* x, CanvasPropertyPrimitive* y,
13452244fff29042926e21fa897ef5ab11148e35299John Reck                CanvasPropertyPrimitive* radius, CanvasPropertyPaint* paint);
135d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawOval(float left, float top, float right, float bottom,
136d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const SkPaint* paint);
137486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawArc(float left, float top, float right, float bottom,
138d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float startAngle, float sweepAngle, bool useCenter, const SkPaint* paint);
139d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPath(const SkPath* path, const SkPaint* paint);
140d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawLines(const float* points, int count, const SkPaint* paint);
141d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawPoints(const float* points, int count, const SkPaint* paint);
14214e513058ed4168c94e015638d16f5f87fd8063aChris Craik
14314e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // Text
14414e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
145d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* positions, const SkPaint* paint, float totalAdvance, const Rect& bounds,
14614e513058ed4168c94e015638d16f5f87fd8063aChris Craik            DrawOpMode drawOpMode = kDrawOpMode_Immediate);
147d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, const SkPath* path,
148d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            float hOffset, float vOffset, const SkPaint* paint);
149486590963e2207d68eebd6944fec70d50d41116aChet Haase    virtual status_t drawPosText(const char* text, int bytesCount, int count,
150d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            const float* positions, const SkPaint* paint);
1514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
15314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Canvas draw operations - special
15414e513058ed4168c94e015638d16f5f87fd8063aChris Craik// ----------------------------------------------------------------------------
15512f5e3433226f0a2886a98b0b8da8d5e947c5cdeJohn Reck    virtual status_t drawLayer(DeferredLayerUpdater* layerHandle, float x, float y);
156a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    virtual status_t drawRenderNode(RenderNode* renderNode, Rect& dirty, int32_t replayFlags);
1574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
15814e513058ed4168c94e015638d16f5f87fd8063aChris Craik    // TODO: rename for consistency
15914e513058ed4168c94e015638d16f5f87fd8063aChris Craik    virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
1605ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
161cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    void setHighContrastText(bool highContrastText) {
162cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        mHighContrastText = highContrastText;
163cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    }
1644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
1658afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    enum DeferredBarrierType {
1668afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_None,
1678afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_InOrder,
1688afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik        kBarrier_OutOfOrder,
1698afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    };
1708afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
1718afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushRestoreToCount();
1728afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushTranslate();
1738afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    void flushReorderBarrier();
1744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1752af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    LinearAllocator& alloc() { return mDisplayListData->allocator; }
176b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik
177b3cca876c2e11b865cb4f83abe2c48a60b95af5bChris Craik    // Each method returns final index of op
1788afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addOpAndUpdateChunk(DisplayListOp* op);
1798afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    // flushes any deferred operations, and appends the op
1808afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t flushAndAddOp(DisplayListOp* op);
1818afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
1828afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addStateOp(StateOp* op);
1838afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addDrawOp(DrawOp* op);
1848afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    size_t addRenderNodeOp(DrawRenderNodeOp* op);
1858afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik
1864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1872af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    template<class T>
188d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const T* refBuffer(const T* srcBuffer, int32_t count) {
189d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        if (!srcBuffer) return NULL;
190d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
1912af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        T* dstBuffer = (T*) mDisplayListData->allocator.alloc(count * sizeof(T));
1922af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        memcpy(dstBuffer, srcBuffer, count * sizeof(T));
1932af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return dstBuffer;
1944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
1962af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik    inline char* refText(const char* text, size_t byteLength) {
1972af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return (char*) refBuffer<uint8_t>((uint8_t*)text, byteLength);
1984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
1994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
200d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPath* refPath(const SkPath* path) {
2012af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        if (!path) return NULL;
2022fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
203d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkPath* pathCopy = mPathMap.valueFor(path);
2042fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
205d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            SkPath* newPathCopy = new SkPath(*path);
206d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            newPathCopy->setSourcePath(path);
207d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik
208d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik            pathCopy = newPathCopy;
20996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
21096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
21144fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->paths.add(pathCopy);
2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
21344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        if (mDisplayListData->sourcePaths.indexOf(path) < 0) {
214a35778c799e8073a42b9e22191bde9d838327ab7John Reck            mResourceCache.incrementRefcount(path);
21544fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->sourcePaths.add(path);
216d34dd71800d9a1077e58c3b7f2511c46848da417Chet Haase        }
2172af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return pathCopy;
2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
220d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkPaint* refPaint(const SkPaint* paint) {
221cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        if (!paint) return NULL;
2220fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
22369e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik        const SkPaint* paintCopy = mPaintMap.valueFor(paint);
22469e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik        if (paintCopy == NULL
22569e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                || paintCopy->getGenerationID() != paint->getGenerationID()
22669e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                // We can't compare shader pointers because that will always
22769e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                // change as we do partial copying via wrapping. However, if the
22869e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                // shader changes the paint generationID will have changed and
22969e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                // so we don't hit this comparison anyway
23069e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                || !(paint->getShader() && paintCopy->getShader()
23169e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik                        && paint->getShader()->getGenerationID() == paintCopy->getShader()->getGenerationID())) {
23269e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik            paintCopy = copyPaint(paint);
23369e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik            // replaceValueFor() performs an add if the entry doesn't exist
23469e65019b0a6204f0ed9487d8fd7b3564eba6df8Chris Craik            mPaintMap.replaceValueFor(paint, paintCopy);
235d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
2360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
237e816baea651476aca4407200d4a5e629b9ab8dfaChet Haase        return paintCopy;
2380fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
2390fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
240cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    inline SkPaint* copyPaint(const SkPaint* paint) {
241cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        if (!paint) return NULL;
242cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        SkPaint* paintCopy = new SkPaint(*paint);
243c1469f39b571f5660346fc837ac30b19d7651a43John Reck        if (paint->getShader()) {
244c1469f39b571f5660346fc837ac30b19d7651a43John Reck            SkShader* shaderCopy = SkShader::CreateLocalMatrixShader(
245c1469f39b571f5660346fc837ac30b19d7651a43John Reck                    paint->getShader(), paint->getShader()->getLocalMatrix());
246c1469f39b571f5660346fc837ac30b19d7651a43John Reck            paintCopy->setShader(shaderCopy);
247c1469f39b571f5660346fc837ac30b19d7651a43John Reck            paintCopy->setGenerationID(paint->getGenerationID());
248c1469f39b571f5660346fc837ac30b19d7651a43John Reck            shaderCopy->setGenerationID(paint->getShader()->getGenerationID());
249c1469f39b571f5660346fc837ac30b19d7651a43John Reck            shaderCopy->unref();
250c1469f39b571f5660346fc837ac30b19d7651a43John Reck        }
251cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        mDisplayListData->paints.add(paintCopy);
252cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik        return paintCopy;
253cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    }
254cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik
255d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkRegion* refRegion(const SkRegion* region) {
256735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        if (!region) {
257735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            return region;
258735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
259735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
260d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik        const SkRegion* regionCopy = mRegionMap.valueFor(region);
261735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        // TODO: Add generation ID to SkRegion
262735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        if (regionCopy == NULL) {
263735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            regionCopy = new SkRegion(*region);
264735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            // replaceValueFor() performs an add if the entry doesn't exist
265735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            mRegionMap.replaceValueFor(region, regionCopy);
26644fd8d24f761f82d21e9b00932648a1b6bf91449John Reck            mDisplayListData->regions.add(regionCopy);
267735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        }
268735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
269735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy        return regionCopy;
270735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    }
271735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
272d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkBitmap* refBitmap(const SkBitmap* bitmap) {
273d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
274d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
275d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
276d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
27744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->bitmapResources.add(bitmap);
278a35778c799e8073a42b9e22191bde9d838327ab7John Reck        mResourceCache.incrementRefcount(bitmap);
2792af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return bitmap;
2805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
282d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const SkBitmap* refBitmapData(const SkBitmap* bitmap) {
28344fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->ownedBitmapResources.add(bitmap);
284a35778c799e8073a42b9e22191bde9d838327ab7John Reck        mResourceCache.incrementRefcount(bitmap);
2852af4635e4a9e448a65ff541252f8f94bc6ac48e0Chris Craik        return bitmap;
28649c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    }
28749c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy
288d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) {
28944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck        mDisplayListData->patchResources.add(patch);
290a35778c799e8073a42b9e22191bde9d838327ab7John Reck        mResourceCache.incrementRefcount(patch);
291e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy        return patch;
292e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    }
293e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
294d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkPaint*, const SkPaint*> mPaintMap;
295d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkPath*, const SkPath*> mPathMap;
296d218a92c0afb8c0d98135b20b52ac87236e1c935Chris Craik    DefaultKeyedVector<const SkRegion*, const SkRegion*> mRegionMap;
29724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
298a35778c799e8073a42b9e22191bde9d838327ab7John Reck    ResourceCache& mResourceCache;
29944fd8d24f761f82d21e9b00932648a1b6bf91449John Reck    DisplayListData* mDisplayListData;
30058ecc204fbcacef34806290492384677a330d4d4Romain Guy
30133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
30233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
3038afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    bool mHasDeferredTranslate;
3048afd0f245cc0c4a0366f39f41b5f78e47ee83be3Chris Craik    DeferredBarrierType mDeferredBarrierType;
305cce47eb580d666ead1f6095d1e3b65233592bbaaChris Craik    bool mHighContrastText;
30654c1a64d5441a964890b44280e4457e11f4f924aRomain Guy
307eea6ef9c767c734797912022113191dd255c4ae6Chris Craik    int mRestoreSaveCount;
308eea6ef9c767c734797912022113191dd255c4ae6Chris Craik
309e18264b079481a244b30e3f71012c53bbd861f92John Reck    friend class RenderNode;
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3165b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
317