DisplayListRenderer.h revision 5c13d89c1332fcc499379b9064b891187b75ca32
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
174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#ifndef ANDROID_UI_DISPLAY_LIST_RENDERER_H
184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define ANDROID_UI_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,
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShadow
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
111b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void replay(OpenGLRenderer& renderer);
112b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
113b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
114b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
116b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
117b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
118b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
119b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
121b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
122b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
123b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
124b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
125b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
126b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
127b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
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() {
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return &(*mPathHeap)[getInt() - 1];
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1674bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1684bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1694bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
1714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    PathHeap* mPathHeap;
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
1855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkMatrix*> mMatrixResources;
1865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkPaint*> mPaintResources;
1875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkiaShader*> mShaderResources;
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkRefCntPlayback mRCPlayback;
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkTypefacePlayback mTFPlayback;
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2086b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy    void prepare(bool opaque);
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
2114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
2234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2335c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2354bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
2394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
2474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
2514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
2534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList* getDisplayList() const {
255b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return new DisplayList(*this);
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
258b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
259b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
260b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
261b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
2635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
264b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
265b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkMatrix*>& getMatrixResources() const {
2675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mMatrixResources;
268b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
269b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkPaint*>& getPaintResources() const {
2715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mPaintResources;
2725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
2735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
2745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkiaShader*>& getShaderResources() const {
2755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mShaderResources;
276b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
277b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
279b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
2814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
2844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
288b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
2894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
2904bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
2914bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
2924bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2934bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
2944bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
2954bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
2964bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
2984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
3304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
3314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
3375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        addInt((int)paint);
3385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mPaintResources.add(paint);
3395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3405c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(paint);
3414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
3445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        addInt((int)matrix);
3455c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mMatrixResources.add(matrix);
3465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(matrix);
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
3515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        addInt((int)bitmap);
3525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
3535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
3555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
3585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        addInt((int)shader);
3595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mShaderResources.add(shader);
3605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
3615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(shader);
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
3675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkMatrix*> mMatrixResources;
3685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkPaint*> mPaintResources;
3695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkiaShader*> mShaderResources;
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
378b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#endif // ANDROID_UI_DISPLAY_LIST_RENDERER_H
385