DisplayListRenderer.h revision 7b5b6abf852c039983eded25ebe43a70fef5a4ab
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
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
307d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.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
41ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
42ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__)
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
49b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
52b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
53b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
55b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayList();
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
62ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
63ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
652b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
73807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
770fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
825a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
8601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
8701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
88c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
898b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
98ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
99daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
102ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
103ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
104d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase
106cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
107b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
111d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
112d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
135ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
136ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
137ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
138ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1477b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
1487b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
1497b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
1507b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1630fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1650fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1660fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1764bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1784bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
192ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
194d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
1952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
1965a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    Vector<SkPath*> mOriginalPaths;
197d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
19824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
199d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2155977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList* getDisplayList();
2165977baa1fa24125c148a72699b53e62abaf08960Chet Haase
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2187d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    void prepareDirty(float left, float top, float right, float bottom, bool opaque);
21927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void finish();
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
221cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool callDrawGLFunction(Functor *functor, Rect& dirty);
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
223daf98e941e140e8739458126640183b9f296a2abChet Haase    void interrupt();
224daf98e941e140e8739458126640183b9f296a2abChet Haase    void resume();
225daf98e941e140e8739458126640183b9f296a2abChet Haase
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2335b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
238807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    void skew(float sx, float sy);
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2457b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
2467b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy            Rect& dirty, uint32_t level = 0);
247ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2535a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2545a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
26001d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawRoundRect(float left, float top, float right, float bottom,
26101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
26201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawCircle(float x, float y, float radius, SkPaint* paint);
263c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2648b2f5267f16c295f12faab810527cd6311997e34Romain Guy    void drawArc(float left, float top, float right, float bottom,
2658b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
282b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
287b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
28924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
29024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
293d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
294d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
2955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2965c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
2972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
2982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
2992fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
3002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3015a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    const Vector<SkPath*>& getOriginalPaths() const {
3025a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase        return mOriginalPaths;
3035a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    }
3045a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase
305d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
306d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
309ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
310ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
311ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
312ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
31427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
31527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
31627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
31727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
31827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
31927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
32027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
32127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
322b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
32327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3317b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
3327b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
3337b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
3347b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
3357b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
337b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3394bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3404bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3414bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3424bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3434bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3444bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3454bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
355b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3782fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
3792fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
3802fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
3812fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
3822fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
3832fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3842fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
3852fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
3862fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            if (pathCopy == NULL) {
3872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                pathCopy = path;
3885a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                mOriginalPaths.add(path);
3895a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                Caches& caches = Caches::getInstance();
3905a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase                caches.resourceCache.incrementRefcount(path);
3912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            } else {
3922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                pathCopy = new SkPath(*path);
3932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                mPaths.add(pathCopy);
3942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            }
3952fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            mPathMap.add(path, pathCopy);
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3972fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3982fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
40224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
404d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
405d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4060fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
40724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
408d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
409d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
410d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
411d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
412d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4140fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4190fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4200fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4210fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
425d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
426d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
427d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
431d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
432d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
433d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
434d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4350fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
4375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
4385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.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);
462ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
463ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
464ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
465ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
467ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
469d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
47124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
4725a7e828842c26f64bb6e0ef3e0019e1949b245eeChet Haase    Vector<SkPath*> mOriginalPaths;
4732fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
4742fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
4752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
47624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
47724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
47824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
479d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
480d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4835977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList *mDisplayList;
4845977baa1fa24125c148a72699b53e62abaf08960Chet Haase
48527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
48627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
488b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4945b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
495