DisplayListRenderer.h revision bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3
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
4533f6beb10f98e8ba96250e284876d607055d278dRomain Guy#define OP_MAY_BE_SKIPPED_MASK 0xff000000
464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
47ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
52ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
53ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
55b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
58b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
61b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
65b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API ~DisplayList();
674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
68ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
69ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
7104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Non-drawing operations
722b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
80807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
8404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Drawing operations
850fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
905a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
9401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
9501d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
96c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
978b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
100ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
102325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        DrawTextOnPath,
103eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        DrawPosText,
1044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
109ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        ResetPaintFilter,
1115ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        SetupPaintFilter,
112daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    // See flags defined in DisplayList.java
11633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    enum ReplayFlag {
11733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        kReplayFlag_ClipChildren = 0x1
11833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    };
11933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
120ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
121ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1227953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API size_t getSize();
123bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
124bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void outputLogBuffer(int fd);
125bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
126bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
12765b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
12833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level = 0);
129b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
130ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
131ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
13204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    void setRenderable(bool renderable) {
13304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mIsRenderable = renderable;
13404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
13504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
13604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool isRenderable() const {
13704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        return mIsRenderable;
13804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
13904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
14013631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void setName(const char* name) {
14113631f3da855f200a151e7837ed9f6b079622b58Romain Guy        if (name) {
14213631f3da855f200a151e7837ed9f6b079622b58Romain Guy            mName.setTo(name);
14313631f3da855f200a151e7837ed9f6b079622b58Romain Guy        }
14413631f3da855f200a151e7837ed9f6b079622b58Romain Guy    }
14513631f3da855f200a151e7837ed9f6b079622b58Romain Guy
146b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
147b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
148b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
149d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
150d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
151b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
152b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
153b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
154b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
155b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
156b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
157b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
158b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
159b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
160b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
161b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
162b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
163b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
164b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
165b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
1665c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
1675c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
1685c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
1695c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
1705c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
171b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
172b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
173ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
174ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
175ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
176ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
17733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getIndex() {
178b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
179b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
180b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
18133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getInt() {
182b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
183b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
184b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1857b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
1867b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
1877b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
1887b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
189b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
1905c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
191b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
192b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
193b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
1942fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
195b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
196b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
1975ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint* getPaint(OpenGLRenderer& renderer) {
1985ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        return renderer.filterPaint((SkPaint*) getInt());
199b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
200b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2010fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
2020fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
2030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
2040fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
205b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
206b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
207b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
208b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
209b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
210b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
211b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
212b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
213b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2144bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
2154bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
2164bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
2174bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
2184bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
21933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float* getFloats(int32_t& count) {
220b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
221b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
222b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
223b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
224b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
225b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
226b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
227b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
228b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
230ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
231b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
232d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
2332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
234d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
23524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
236d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
237b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
23865b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
23965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
24004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
24104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
24213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
24313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    String8 mName;
244b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
245b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
246b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
247b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
248b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
249b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
250b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
251b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
252b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
253b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
254b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
2557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
2567953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
257b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2587953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
2595977baa1fa24125c148a72699b53e62abaf08960Chet Haase
2607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
2617953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
2627953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
263b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
2647953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool callDrawGLFunction(Functor *functor, Rect& dirty);
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
2677953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
268daf98e941e140e8739458126640183b9f296a2abChet Haase
2697953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
2707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
2717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2737953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
2745c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
2757953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
2765b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
2774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2787953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
2797953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
2807953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
2817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
2824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
2847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
2854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
2874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2887953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
28933f6beb10f98e8ba96250e284876d607055d278dRomain Guy            Rect& dirty, int32_t flags, uint32_t level = 0);
2907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
2917953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
2927953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
2937953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
2944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
2955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
2967953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
2975a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
2987953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
2994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
3005c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
3017953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
3027953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
3037953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
30401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
3057953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
3067953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
3077953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
3088b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
3097953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
3107953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
3117953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
3127953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
3138f9a9f61ab793d9387a5942b307e74324704893bRomain Guy            SkPaint* paint, float length = 1.0f);
314325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
315325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            float hOffset, float vOffset, SkPaint* paint);
316eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
317eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            SkPaint* paint);
3184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3197953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
3207953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
3214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3227953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
3237953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
3244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3257953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
3267953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
3274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
3285ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
3295ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
3305ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
3317953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
3324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
333b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
334b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
335b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
336b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3375c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
3385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
339b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
340b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
341d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
342d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
343d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
344d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
34524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
34624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
347b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
348b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
349d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
350d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
3515c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
3525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
3532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
3542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
3552fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
3562fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
357d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
358d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
359b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
360b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
3614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
36227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
36327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
36427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
36527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
36627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
36727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
36827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
36927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
37033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void insertTranlate() {
37133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (mHasTranslate) {
37233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
37333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mWriter.writeInt(DisplayList::Translate);
37433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                addPoint(mTranslateX, mTranslateY);
37533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mTranslateX = mTranslateY = 0.0f;
37633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
37733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mHasTranslate = false;
37833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
37933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
38033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
38133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addOp(const DisplayList::Op drawOp) {
38227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
38333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
3844aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
38504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
3864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
3874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
38833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) {
38933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertRestoreToCount();
39033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
39133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
39233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (reject) {
39333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp);
394ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            mWriter.writeInt(0xdeaddead);
395ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            uint32_t* location = reject ?
396ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy                    mWriter.peek32(mWriter.size() - sizeof(int32_t)) : NULL;
39733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            return location;
39833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
39933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mWriter.writeInt(drawOp);
40033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return NULL;
40133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
40233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
40333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addSkip(uint32_t* location) {
40433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (location) {
405ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            *location = (int32_t) (mWriter.peek32(
406ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy                    mWriter.size() - sizeof(int32_t)) - location);
40733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
40833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
40933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
41033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addInt(int32_t value) {
4114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
4124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4147b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
4157b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
4167b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
4177b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
4187b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
4194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
4214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
4224bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
4234bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
4244bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
4254bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
4264bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
4274bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
4284bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
4294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
4304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
4314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
4344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
4354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
43733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void addFloats(const float* values, int32_t count) {
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
43933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        for (int32_t i = 0; i < count; i++) {
4404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
4414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
4424aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
4454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
4464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
4474aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
4504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
4514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
4524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
4534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
4544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
4574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
4584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
4594aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4612fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
4622fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
4632fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
4642fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
4652fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
4662fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4672fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
4682fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
469b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
4704bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            pathCopy->setSourcePath(path);
47196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
47296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
473b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
4744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
4752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
4762fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
4774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
4784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
4795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
48024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
4810fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
482d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
483d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4840fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
48522d418437e44587cb0fba4353515719453269189Romain Guy        SkPaint* paintCopy = mPaintMap.valueFor(paint);
486d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
487d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
48896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
48996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPaintMap.replaceValueFor(paint, paintCopy);
490d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
491d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
4920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4930fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
4940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4950fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
4960fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
4970fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
4980fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
4990fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
5000fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
5014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5035c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
504d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
505d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
506f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
507f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
508f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
5094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
512d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
513d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
514d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
515d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
5160fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
5175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
518d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
5195c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
5204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
52224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
52324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
52424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
52524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
52624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
52724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
52824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
5291f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
53024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
53196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
53296ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mShaderMap.replaceValueFor(shader, shaderCopy);
5331f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
53443ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
53524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
53624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
53724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
5384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
5394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
540ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
5410fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
542ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
543d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
544ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
545ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
5465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
547ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
5484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
549d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
5500fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
55124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
5522fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
5532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
5542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
55524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
55624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
55724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
558d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
559d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
5614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
56227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
56333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
56433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
56533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
56633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool mHasTranslate;
56733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
56804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
56927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
570b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
571b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
5734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
5754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
5764aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
578