DisplayListRenderer.h revision 8b2f5267f16c295f12faab810527cd6311997e34
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,
101807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
1050fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
1066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
1105a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
11401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
11501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
116c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
1178b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
126ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
129ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
130ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1315977baa1fa24125c148a72699b53e62abaf08960Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
1325977baa1fa24125c148a72699b53e62abaf08960Chet Haase
133ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    void replay(OpenGLRenderer& renderer, uint32_t level = 0);
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
160ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
161ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
162ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
163ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return &(*mPathHeap)[getInt() - 1];
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
2004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    PathHeap* mPathHeap;
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2145c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
215ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
217d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
218d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
21924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
220d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkRefCntPlayback mRCPlayback;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkTypefacePlayback mTFPlayback;
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2395977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList* getDisplayList();
2405977baa1fa24125c148a72699b53e62abaf08960Chet Haase
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2426b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy    void prepare(bool opaque);
24327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void finish();
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2555b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
260807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    void skew(float sx, float sy);
2614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
267ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    void drawDisplayList(DisplayList* displayList, uint32_t level = 0);
268ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2745a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
28101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawRoundRect(float left, float top, float right, float bottom,
28201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
28301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawCircle(float x, float y, float radius, SkPaint* paint);
284c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2858b2f5267f16c295f12faab810527cd6311997e34Romain Guy    void drawArc(float left, float top, float right, float bottom,
2868b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
3014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
302b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
303b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
304b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3065c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
3075c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
31024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
31124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
314d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
315d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
318d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
319d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
322ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
323ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
324ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
325ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
32727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
32827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
32927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
33027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
33127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
33227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
33327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
33427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
33627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
345b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3474bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3524bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3534bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
363b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
39424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
3950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
396d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
397d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3980fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
39924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
400d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
401d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
402d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
403d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
404d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4050fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4060fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4070fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4080fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4090fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4100fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4110fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
417d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
418d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
419d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
423d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
424d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
425d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
426d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4270fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
4295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
4305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
4315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
43424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
43524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
43624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
43724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
43824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
43924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
44024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4411f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
44224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
44324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4441f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
44543ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
44624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
44724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
44824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
451ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
453ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
454ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
455ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
456ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
457ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
461ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
463d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
46524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
46624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
46724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
46824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
469d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
470d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
4754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
4764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4775977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList *mDisplayList;
4785977baa1fa24125c148a72699b53e62abaf08960Chet Haase
47927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
48027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
489