DisplayListRenderer.h revision 65b345fa22b878e141b8fd8ece9c208df00fa40f
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 <SkRefCnt.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
299c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
317d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.h"
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
406d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_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///////////////////////////////////////////////////////////////////////////////
50b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
53b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
61b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayList();
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
64ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
662b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
74807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
780fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
835a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
8701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
8801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
89c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
908b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
93ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
100ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
101daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
104ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
105ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
106d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1075977baa1fa24125c148a72699b53e62abaf08960Chet Haase
10865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t getSize();
10965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
110cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
112ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
113ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
1149c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase    static void outputLogBuffer(int fd);
1159c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
119d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
120d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
143ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
144ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
145ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
146ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1557b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
1567b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
1577b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
1587b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1844bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1854bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1864bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1874bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
200ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
202d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
2032fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
204d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
20524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
206d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
20865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
20965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
224162a0217563f4665da6eb183dfce0fef740f641fJeff Brown    DisplayList* getDisplayList(DisplayList* displayList);
2255977baa1fa24125c148a72699b53e62abaf08960Chet Haase
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2277d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    void prepareDirty(float left, float top, float right, float bottom, bool opaque);
22827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void finish();
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
230cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool callDrawGLFunction(Functor *functor, Rect& dirty);
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
232daf98e941e140e8739458126640183b9f296a2abChet Haase    void interrupt();
233daf98e941e140e8739458126640183b9f296a2abChet Haase    void resume();
234daf98e941e140e8739458126640183b9f296a2abChet Haase
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2415b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2425b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
247807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    void skew(float sx, float sy);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2547b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
2557b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy            Rect& dirty, uint32_t level = 0);
256ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2625a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2635a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2654bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
26901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawRoundRect(float left, float top, float right, float bottom,
27001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
27101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawCircle(float x, float y, float radius, SkPaint* paint);
272c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2738b2f5267f16c295f12faab810527cd6311997e34Romain Guy    void drawArc(float left, float top, float right, float bottom,
2748b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
277ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy    void drawPoints(float* points, int count, SkPaint* paint);
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
293b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
294b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
299d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
300d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
301d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
302d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
30324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
30424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
305b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
307d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
308d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3112fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
3122fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
3132fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
3142fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
315d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
316d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
317b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
32027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
32127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
32227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
32327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
32427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
32527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
32627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
32727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
328b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
32927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3377b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
3387b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
3397b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
3407b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
3417b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3454bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3464bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3474bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3484bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3514bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
3852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
3862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
3872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
3882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
3892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3902fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
3912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
392b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
3932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            mPathMap.add(path, pathCopy);
394b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3962fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
40124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4020fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
403d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
404d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4050fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
40624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
407d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
408d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
409d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
410d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
411d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4140fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4190fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4200fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
424d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
425d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
426f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
427f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
428f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
432d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
433d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
434d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
435d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
438d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
4395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
44224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
44324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
44424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
44524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
44624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
44724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
44824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4491f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
45024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
45124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4521f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
45343ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
45424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
45524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
45624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
459ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
461ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
462d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
463ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
464ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
466ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
468d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4690fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
47024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
4712fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
4722fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
4732fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
47424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
47524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
47624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
477d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
478d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
48127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
48227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
491