DisplayListRenderer.h revision 7953745dd565167113f8cbfc461bc0521d32d870
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h>
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h>
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
297953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
307953745dd565167113f8cbfc461bc0521d32d870Romain Guy
319c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
337d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.h"
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
426d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__)
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
52b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
55b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
56b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
637953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API ~DisplayList();
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
65ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
66ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
6804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Non-drawing operations
692b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
77807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
8104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Drawing operations
820fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
875a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
9101d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
9201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
93c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
948b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
97ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
104ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
105daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
108ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
109ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
110d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1115977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1127953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API size_t getSize();
11365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
114cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
115b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
116ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
117ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
1187953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API static void outputLogBuffer(int fd);
1199c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
12004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    void setRenderable(bool renderable) {
12104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mIsRenderable = renderable;
12204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
12304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
12404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool isRenderable() const {
12504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        return mIsRenderable;
12604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
12704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
128b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
130b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
131d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
132d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
133b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
134b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
135b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1485c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1495c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1505c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
155ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
156ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
157ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
158ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1677b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
1687b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
1697b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
1707b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1725c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1830fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
187b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1964bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
1974bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
1984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
1994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
212ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
214d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
2152fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
216d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
21724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
218d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
22065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
22165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
22204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
22304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
2357953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
2367953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2387953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
2395977baa1fa24125c148a72699b53e62abaf08960Chet Haase
2407953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
2417953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
2427953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2447953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool callDrawGLFunction(Functor *functor, Rect& dirty);
2454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2467953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
2477953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
248daf98e941e140e8739458126640183b9f296a2abChet Haase
2497953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
2507953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
2517953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
2524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2537953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
2545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
2565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2587953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
2597953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
2607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
2617953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2637953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
2647953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2687953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
2697b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy            Rect& dirty, uint32_t level = 0);
2707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2727953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2737953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2787953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
2827953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
2837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
28401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
2857953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
2867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2877953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
2888b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2897953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
2907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
2917953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
2927953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
2937953745dd565167113f8cbfc461bc0521d32d870Romain Guy            SkPaint* paint);
2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2957953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
2967953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2987953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
2997953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3017953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
3027953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
3034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3047953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
3054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
306b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
307b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
3115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
312b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
313b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
314d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
315d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
316d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
317d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
31824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
31924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
320b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
321b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
322d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
323d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3262fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
3272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
3282fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
3292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
330d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
331d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
332b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
33527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
33627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
33727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
33827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
33927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
34027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
34127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
34227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
343b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
34427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
34604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3537b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
3547b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
3557b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
3567b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
3577b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
3584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3614bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3624bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3634bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3644bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3654bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3664bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3674bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4002fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
4012fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
4022fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
4032fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
4042fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
4052fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4062fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
4072fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
408b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
4092fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            mPathMap.add(path, pathCopy);
410b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
4122fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4132fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
41724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
419d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
420d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4210fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
42224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
423d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
424d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
425d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
426d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
427d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4290fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4300fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4310fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4320fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4330fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4340fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4350fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
440d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
441d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
442f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
443f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
444f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4475c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
448d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
449d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
450d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
451d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4535c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
454d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
4555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
45824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
45924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
46024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
46124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
46224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
46324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
46424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4651f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
46624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
46724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4681f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
46943ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
47024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
47124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
47224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
475ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
477ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
478d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
479ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
480ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
482ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
484d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
48624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
4872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
4882fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
4892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
49024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
49124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
49224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
493d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
494d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
49727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
49804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
49927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
500b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
501b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
5034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
5064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5075b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
508