DisplayListRenderer.h revision 0fe478ea04720a57ef3919dbc23711bc7eba517f
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h>
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h>
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPictureFlat.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define HEAP_BLOCK_SIZE 4096
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Helpers
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass PathHeap: public SkRefCnt {
474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
487975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap();
497975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap(SkFlattenableReadBuffer& buffer);
507975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    ~PathHeap();
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
527975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    int append(const SkPath& path);
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int count() const { return mPaths.count(); }
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath& operator[](int index) const {
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return *mPaths[index];
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
607975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    void flatten(SkFlattenableWriteBuffer& buffer) const;
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<SkPath*> mPaths;
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy};
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
68b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
71b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
72b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
74b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
76b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
78b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
79b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayList();
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        AcquireContext,
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ReleaseContext,
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Save,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShadow
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void replay(OpenGLRenderer& renderer);
114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
131b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
140ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
141ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
142ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
143ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return &(*mPathHeap)[getInt() - 1];
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1640fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1650fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1660fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1670fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1784bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1814bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    PathHeap* mPathHeap;
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
1955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkiaShader*> mShaderResources;
196ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
198d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
199d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
200d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkRefCntPlayback mRCPlayback;
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkTypefacePlayback mTFPlayback;
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2206b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy    void prepare(bool opaque);
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2315b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2430fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    void drawDisplayList(DisplayList* displayList);
2445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2504bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList* getDisplayList() const {
270b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return new DisplayList(*this);
271b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
272b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
273b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
274b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
275b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2775c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
280b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
281d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkiaShader*>& getShaderResources() const {
282d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mShaderResources;
283b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
284b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
285d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
286d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
2875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
289d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
290d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
291b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
292b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
293ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
294ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
295ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
296ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
298b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3114bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3124bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3134bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3154bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
3534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
356d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paint == NULL) {
3570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
358d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
359d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
361d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        SkPaint *paintCopy =  mPaintMap.valueFor(paint);
362d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
363d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
364d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
365d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
366d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
3670fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3680fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
3690fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
3700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
3710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
3720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
3730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
3740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
3750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
379d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
380d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
381d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
385d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
386d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
387d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
388d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
3890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
3905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
3915c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3925c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
3935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
3960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) shader);
3975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mShaderResources.add(shader);
3985c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(shader);
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
402ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
404ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
405ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
406ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
407ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
408ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
4125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkiaShader*> mShaderResources;
413ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
415d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
417d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
418d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
4234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
4244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
426b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4325b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
433