DisplayListRenderer.h revision 2fc941e4650d618ff6e122f28b616d9032ffa134
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"
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
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384
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,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
99ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
100daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
103ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
104ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1055977baa1fa24125c148a72699b53e62abaf08960Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
1065977baa1fa24125c148a72699b53e62abaf08960Chet Haase
107daf98e941e140e8739458126640183b9f296a2abChet Haase    bool replay(OpenGLRenderer& renderer, uint32_t level = 0);
108b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
109b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
110b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1275c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
134ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
135ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
136ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
137ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1512fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1610fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1754bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
187ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
189d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
1902fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
191d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
19224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
193d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2095977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList* getDisplayList();
2105977baa1fa24125c148a72699b53e62abaf08960Chet Haase
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2127d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy    void prepareDirty(float left, float top, float right, float bottom, bool opaque);
21327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void finish();
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
215daf98e941e140e8739458126640183b9f296a2abChet Haase    bool callDrawGLFunction(Functor *functor);
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
217daf98e941e140e8739458126640183b9f296a2abChet Haase    void interrupt();
218daf98e941e140e8739458126640183b9f296a2abChet Haase    void resume();
219daf98e941e140e8739458126640183b9f296a2abChet Haase
2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2265b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2275b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
232807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    void skew(float sx, float sy);
2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
239daf98e941e140e8739458126640183b9f296a2abChet Haase    bool drawDisplayList(DisplayList* displayList, uint32_t level = 0);
240ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2465a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2475a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2494bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
25301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawRoundRect(float left, float top, float right, float bottom,
25401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
25501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawCircle(float x, float y, float radius, SkPaint* paint);
256c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2578b2f5267f16c295f12faab810527cd6311997e34Romain Guy    void drawArc(float left, float top, float right, float bottom,
2588b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
281b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
28224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
28324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
285b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
286d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
287d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
2885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
2902fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
2912fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
2922fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
2932fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
294d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
295d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
296b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
297b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
298ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
299ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
300ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
301ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
3024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
30327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
30427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
30527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
30627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
30727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
30827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
30927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
31027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
31227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3234bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3264bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3294bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
3632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
3642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
3652fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
3662fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
3672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
3692fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
3702fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            if (pathCopy == NULL) {
3712fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                pathCopy = path;
3722fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            } else {
3732fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                pathCopy = new SkPath(*path);
3742fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy                mPaths.add(pathCopy);
3752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            }
3762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            mPathMap.add(path, pathCopy);
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3782fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
3792fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3825c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
38324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
3840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
385d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
386d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
38824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
389d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
390d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
391d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
392d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
393d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
3960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
3970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3980fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
3990fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4000fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4020fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4055c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
406d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
407d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
408d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
412d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
413d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
414d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
415d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
4185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
4195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
4205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
42324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
42424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
42524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
42624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
42724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
42824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
42924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4301f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
43124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
43224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4331f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
43443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
43524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
43624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
43724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
440ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
442ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
443ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
444ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
445ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
446ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
448ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
450d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4510fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
45224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
4532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
4542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
4552fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
45624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
45724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
45824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
459d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
460d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4635977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList *mDisplayList;
4645977baa1fa24125c148a72699b53e62abaf08960Chet Haase
46527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
46627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
475