DisplayListRenderer.h revision 43ccf4663c822ddd435b7683cc05221f6169c6c3
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 <SkChunkAlloc.h>
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h>
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPictureFlat.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define HEAP_BLOCK_SIZE 4096
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__)
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Helpers
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass PathHeap: public SkRefCnt {
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
557975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap();
567975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap(SkFlattenableReadBuffer& buffer);
577975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    ~PathHeap();
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
597975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    int append(const SkPath& path);
604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int count() const { return mPaths.count(); }
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath& operator[](int index) const {
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return *mPaths[index];
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
677975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    void flatten(SkFlattenableWriteBuffer& buffer) const;
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<SkPath*> mPaths;
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy};
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
75b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
78b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
79b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
81b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
83b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
85b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayList();
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
88ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
89ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
91ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        AcquireContext = 0,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ReleaseContext,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Save,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
975b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
1040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
1056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
123ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
124ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1255977baa1fa24125c148a72699b53e62abaf08960Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
1265977baa1fa24125c148a72699b53e62abaf08960Chet Haase
127ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    void replay(OpenGLRenderer& renderer, uint32_t level = 0);
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
155ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
156ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
157ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return &(*mPathHeap)[getInt() - 1];
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1780fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1790fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1800fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1924bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1934bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1944bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1954bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    PathHeap* mPathHeap;
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
209ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
211d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
212d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
21324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
214d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkRefCntPlayback mRCPlayback;
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkTypefacePlayback mTFPlayback;
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2335977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList* getDisplayList();
2345977baa1fa24125c148a72699b53e62abaf08960Chet Haase
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2366b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy    void prepare(bool opaque);
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2475b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2485b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
259ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    void drawDisplayList(DisplayList* displayList, uint32_t level = 0);
260ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2674bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
286b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
289b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
29424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
29524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
298d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
299d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
302d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
303d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
306ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
307ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
308ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
309ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3224bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3234bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3264bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
36924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
3700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
371d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
372d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
37424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
375d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
376d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
377d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
378d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
379d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3800fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
3820fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
3830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
3850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
3860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
3870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
3880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
392d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
393d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
394d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
398d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
399d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
400d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
401d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4020fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
4045c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
4055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
4065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
40924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
41024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
41124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
41224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
41324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
41424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
41524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4161f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
41724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
41824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4191f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
42043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
42124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
42224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
42324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
426ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4270fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
428ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
429ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
430ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
431ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
432ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
436ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
438d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4390fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
44024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
44124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
44224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
44324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
444d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
445d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4525977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList *mDisplayList;
4535977baa1fa24125c148a72699b53e62abaf08960Chet Haase
454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
462