DisplayListRenderer.h revision daf98e941e140e8739458126640183b9f296a2ab
14aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/*
24aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Copyright (C) 2010 The Android Open Source Project
34aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
44aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
54aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * you may not use this file except in compliance with the License.
64aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * You may obtain a copy of the License at
74aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
84aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
94aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy *
104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * Unless required by applicable law or agreed to in writing, software
114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * See the License for the specific language governing permissions and
144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy * limitations under the License.
154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkChunkAlloc.h>
214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkFlattenable.h>
224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkMatrix.h>
234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPictureFlat.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
31daf98e941e140e8739458126640183b9f296a2abChet Haase#include "Functor.h"
324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define MIN_WRITER_SIZE 16384
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#define HEAP_BLOCK_SIZE 4096
424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
43ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
44ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...) LOGD(__VA_ARGS__)
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Helpers
524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyclass PathHeap: public SkRefCnt {
554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
567975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap();
577975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    PathHeap(SkFlattenableReadBuffer& buffer);
587975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    ~PathHeap();
594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
607975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    int append(const SkPath& path);
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int count() const { return mPaths.count(); }
634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
64b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath& operator[](int index) const {
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        return *mPaths[index];
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
687975fb6d12cb1eb96b75e3a563627cd4c4081bd6Romain Guy    void flatten(SkFlattenableWriteBuffer& buffer) const;
694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkTDArray<SkPath*> mPaths;
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy};
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
76b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
79b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
80b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
82b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
84b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
86b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
87b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayList();
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
89ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
90ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
92ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        AcquireContext = 0,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ReleaseContext,
944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Save,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
985b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
102807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
1060fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
1076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
1115a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
11501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
11601d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
117c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
1188b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
1194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
127ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
128daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
131ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
132ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1335977baa1fa24125c148a72699b53e62abaf08960Chet Haase    void initFromDisplayListRenderer(const DisplayListRenderer& recorder);
1345977baa1fa24125c148a72699b53e62abaf08960Chet Haase
135daf98e941e140e8739458126640183b9f296a2abChet Haase    bool replay(OpenGLRenderer& renderer, uint32_t level = 0);
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
137b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
138b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
139b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
140b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
141b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
143b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
144b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
145b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
149b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
150b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1565c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1585c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
162ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
163ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
164ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
165ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
166b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getIndex() {
167b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
168b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
169b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
170b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline int getInt() {
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
173b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
174b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
176b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
177b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return &(*mPathHeap)[getInt() - 1];
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
181b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPaint* getPaint() {
1835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkPaint*) getInt();
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
185b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1860fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
1870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
1880fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
1890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
190b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
194b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
197b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
198b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
2004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
2014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
2024bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2034bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
204b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    float* getFloats(int& count) {
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
214b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    PathHeap* mPathHeap;
215b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
217ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
218b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
219d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
220d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
22124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
222d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkRefCntPlayback mRCPlayback;
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkTypefacePlayback mTFPlayback;
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
229b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
230b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
232b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
233b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
234b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
235b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
236b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
238b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayListRenderer();
239b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    ~DisplayListRenderer();
240b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2415977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList* getDisplayList();
2425977baa1fa24125c148a72699b53e62abaf08960Chet Haase
243b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void setViewport(int width, int height);
2446b7bd24659fb175fe1f0e97c86c18969918b496aRomain Guy    void prepare(bool opaque);
24527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void finish();
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
247daf98e941e140e8739458126640183b9f296a2abChet Haase    bool callDrawGLFunction(Functor *functor);
2484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void acquireContext();
2494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void releaseContext();
2504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
251daf98e941e140e8739458126640183b9f296a2abChet Haase    void interrupt();
252daf98e941e140e8739458126640183b9f296a2abChet Haase    void resume();
253daf98e941e140e8739458126640183b9f296a2abChet Haase
2544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int save(int flags);
2554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restore();
2564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void restoreToCount(int saveCount);
2574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    int saveLayer(float left, float top, float right, float bottom,
2595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2605b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    int saveLayerAlpha(float left, float top, float right, float bottom,
2615b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void translate(float dx, float dy);
2644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void rotate(float degrees);
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void scale(float sx, float sy);
266807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy    void skew(float sx, float sy);
2674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setMatrix(SkMatrix* matrix);
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void concatMatrix(SkMatrix* matrix);
2704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
273daf98e941e140e8739458126640183b9f296a2abChet Haase    bool drawDisplayList(DisplayList* displayList, uint32_t level = 0);
274ada830f639591b99c3e40de22b07296c7932a33fRomain Guy    void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2765c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2805a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy    void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2815a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2834bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
2845c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawColor(int color, SkXfermode::Mode mode);
2865c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
28701d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawRoundRect(float left, float top, float right, float bottom,
28801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
28901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy    void drawCircle(float x, float y, float radius, SkPaint* paint);
290c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy    void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
2918b2f5267f16c295f12faab810527cd6311997e34Romain Guy    void drawArc(float left, float top, float right, float bottom,
2928b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
2934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawPath(SkPath* path, SkPaint* paint);
2945c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    void drawLines(float* points, int count, SkPaint* paint);
2954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void drawText(const char* text, int bytesCount, int count, float x, float y, SkPaint* paint);
2964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShader();
2984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShader(SkiaShader* shader);
2994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetColorFilter();
3014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupColorFilter(SkiaColorFilter* filter);
3024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void resetShadow();
3044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void setupShadow(float radius, float dx, float dy, int color);
3054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void reset();
3074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
308b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
309b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
310b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
311b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
3135c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
314b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
315b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
31624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
31724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
318b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
319b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
320d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
321d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
324d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
325d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
326b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
327b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
328ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    const Vector<SkiaColorFilter*>& getFilterResources() const {
329ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return mFilterResources;
330ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
331ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
33327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
33427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
33527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
33627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
33727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
33827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
33927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
34027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
341b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline void addOp(DisplayList::Op drawOp) {
34227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
3434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
3444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addInt(int value) {
3474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
3484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
351b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
3534bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
3544bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
3554bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
3564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
3574bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
3584bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
3594bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
3604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
3654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
3664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addFloats(const float* values, int count) {
369b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
3704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (int i = 0; i < count; i++) {
3714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
3724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
3764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
3774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
3784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
3814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
3824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
3834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
3854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
3884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
3894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
3904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPath(const SkPath* path) {
3934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        if (mPathHeap == NULL) {
3944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mPathHeap = new PathHeap();
3954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
3964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        addInt(mPathHeap->append(*path));
3974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
40024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
402d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
403d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
40524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkPaint* paintCopy =  mPaintMap.valueFor(paint);
406d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
407d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
408d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaintMap.add(paint, paintCopy);
409d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
410d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4110fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4130fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4140fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4150fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4180fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
4190fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
4204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
423d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
424d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
425d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        addInt((int) new SkMatrix(*matrix));
4264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4285c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
429d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
430d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
431d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
432d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
4330fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
4345c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
4355c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        Caches& caches = Caches::getInstance();
4365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        caches.resourceCache.incrementRefcount(bitmap);
4375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4395c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
44024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
44124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
44224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
44324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
44424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
44524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
44624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
4471f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
44824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
44924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            mShaderMap.add(shader, shaderCopy);
4501f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
45143ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
45224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
45324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
45424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
457ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
4580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
459ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
460ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        Caches& caches = Caches::getInstance();
461ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        caches.resourceCache.incrementRefcount(colorFilter);
462ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
463ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
4644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkChunkAlloc mHeap;
4654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
467ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
4684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
469d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
47124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
47224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
47324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
47424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
475d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
476d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    PathHeap* mPathHeap;
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
4794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mRCRecorder;
4814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkRefCntRecorder mTFRecorder;
4824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4835977baa1fa24125c148a72699b53e62abaf08960Chet Haase    DisplayList *mDisplayList;
4845977baa1fa24125c148a72699b53e62abaf08960Chet Haase
48527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
48627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
488b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
4904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
4924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
4934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4945b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
495