DisplayListRenderer.h revision 13631f3da855f200a151e7837ed9f6b079622b58
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
3113631f3da855f200a151e7837ed9f6b079622b58Romain Guy#include <utils/String8.h>
3213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
339c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
357d7b5490a0b0763e831b31bc11f17d8159b5914aRomain Guy#include "utils/Functor.h"
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
446d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096
454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
54b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
57b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
60b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
657953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API ~DisplayList();
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
67ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
7004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Non-drawing operations
712b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
79807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
8304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Drawing operations
840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
856c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
895a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
9301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
9401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
95c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
968b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
99ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
101eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        DrawPosText,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
107ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        ResetPaintFilter,
1095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        SetupPaintFilter,
110daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
114ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
115d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1165977baa1fa24125c148a72699b53e62abaf08960Chet Haase
1177953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API size_t getSize();
11865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
119cabfcc1364eb7e4de0b15b3574fba45027b45cfcRomain Guy    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
120b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
121ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
122ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
1237953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API static void outputLogBuffer(int fd);
1249c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase
12504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    void setRenderable(bool renderable) {
12604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mIsRenderable = renderable;
12704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
12804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
12904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool isRenderable() const {
13004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        return mIsRenderable;
13104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
13204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
13313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void setName(const char* name) {
13413631f3da855f200a151e7837ed9f6b079622b58Romain Guy        if (name) {
13513631f3da855f200a151e7837ed9f6b079622b58Romain Guy            mName.setTo(name);
13613631f3da855f200a151e7837ed9f6b079622b58Romain Guy        }
13713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    }
13813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
142d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
143d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1605c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1615c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1625c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1635c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
166ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
167ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
168ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
169ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
175b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1787b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
1797b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
1807b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
1817b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
186b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
188b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1905ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint* getPaint(OpenGLRenderer& renderer) {
1915ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        return renderer.filterPaint((SkPaint*) getInt());
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
201b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
202b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
203b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2074bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
2084bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
2094bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
2104bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2114bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
216b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
217b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
219b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
223ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
225d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
2262fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
227d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
22824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
229d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
23165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
23265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
23304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
23404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
23513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
23613631f3da855f200a151e7837ed9f6b079622b58Romain Guy    String8 mName;
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
241b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
242b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
2487953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
2497953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2517953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
2525977baa1fa24125c148a72699b53e62abaf08960Chet Haase
2537953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
2547953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
2557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
256b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2577953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool callDrawGLFunction(Functor *functor, Rect& dirty);
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2597953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
2607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
261daf98e941e140e8739458126640183b9f296a2abChet Haase
2627953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
2637953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
2647953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
2675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2687953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
2695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
2727953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
2737953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
2747953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
2754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
2777953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2797953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
2827b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy            Rect& dirty, uint32_t level = 0);
2837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2857953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2885c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2897953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2917953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2924bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2947953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
2957953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
2967953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
29701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
2987953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
2997953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
3007953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
3018b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
3027953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
3037953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
3047953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
3057953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
3068f9a9f61ab793d9387a5942b307e74324704893bRomain Guy            SkPaint* paint, float length = 1.0f);
307eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
308eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            SkPaint* paint);
3094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3107953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
3117953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
3124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3137953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
3147953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
3154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3167953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
3177953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
3205ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
3215ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
3227953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
3234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
324b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
325b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
3295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
330b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
331b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
332d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
333d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
334d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
335d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
33624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
33724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
338b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
340d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
341d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3435c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
3452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
3462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
3472fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
348d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
350b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
35327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
35427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
35527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
35627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
35727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
35827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
35927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
36027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
361b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
36227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
36404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3717b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
3727b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
3737b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
3747b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
3757b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
377b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3804bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3814bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3824bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3834bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3844bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3854bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
4024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
4034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
4044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
4074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
4084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
4094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
4104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
4144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
4154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
4164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4182fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
4192fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
4202fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
4212fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
4222fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
4232fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4242fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
4252fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
426b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
4272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            mPathMap.add(path, pathCopy);
428b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
4302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
43524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4360fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
437d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
438d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4390fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
44022d418437e44587cb0fba4353515719453269189Romain Guy        SkPaint* paintCopy = mPaintMap.valueFor(paint);
441d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
442d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
443d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
444d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
445d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4470fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4480fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4490fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4510fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4520fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4530fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4540fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
458d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
459d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
460f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
461f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
462f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
4634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
466d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
467d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
468d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
469d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
472d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
4735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
47624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
47724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
47824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
47924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
48024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
48124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
48224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4831f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
48424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
48524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4861f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
48743ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
48824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
48924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
49024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
493ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
495ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
496d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
497ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
498ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
500ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
502d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
5030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
50424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
5052fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
5062fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
5072fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
50824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
50924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
51024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
511d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
512d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
5134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
5144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
51527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
51604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
51727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
518b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
519b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
5214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
5244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5255b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
526