DisplayListRenderer.h revision 6554943a1dd6854c0f4976900956e556767b49e1
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>
23a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#include <SkCamera.h>
244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPaint.h>
254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkPath.h>
264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkRefCnt.h>
274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTDArray.h>
284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include <SkTSearch.h>
294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
307953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <cutils/compiler.h>
317953745dd565167113f8cbfc461bc0521d32d870Romain Guy
329c1e23baf5bfbebd1aebbd6d9a18c225325567ceChet Haase#include "DisplayListLogBuffer.h"
334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy#include "OpenGLRenderer.h"
344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace android {
364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guynamespace uirenderer {
374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy// Defines
404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
426d7475d666baefaa3ba9f0dcee25238739454241Romain Guy#define MIN_WRITER_SIZE 4096
4333f6beb10f98e8ba96250e284876d607055d278dRomain Guy#define OP_MAY_BE_SKIPPED_MASK 0xff000000
444aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
45ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy// Debug
46ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#if DEBUG_DISPLAY_LIST
475baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    #define DISPLAY_LIST_LOGD(...) ALOGD(__VA_ARGS__)
48ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#else
49ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    #define DISPLAY_LIST_LOGD(...)
50ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy#endif
51ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
52a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// Set to 1 to enable native processing of View properties. 0 by default. Eventually this
53a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase// will go away and we will always use this approach for accelerated apps.
54ad13c81371cb0b7e49b4c33159a346ce08ac5d69Chet Haase#define USE_DISPLAY_LIST_PROPERTIES 0
55a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
56a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define TRANSLATION 0x0001
57a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION    0x0002
58a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION_3D 0x0004
59a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define SCALE       0x0008
60a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define PIVOT       0x0010
61a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
66b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
704aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
71b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
73b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
747953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API ~DisplayList();
754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
76ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
77ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
7904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Non-drawing operations
802b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
88807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
9204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Drawing operations
930fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
985a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
1004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
1014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
10201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
10301d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
104c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
1058b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
1064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
108ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
110325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        DrawTextOnPath,
111eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        DrawPosText,
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
117ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1185ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        ResetPaintFilter,
1195ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        SetupPaintFilter,
120daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
12333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    // See flags defined in DisplayList.java
12433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    enum ReplayFlag {
12533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        kReplayFlag_ClipChildren = 0x1
12633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    };
12733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
128ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
129ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
130a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setViewProperties(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
131a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            uint32_t level);
132a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void outputViewProperties(OpenGLRenderer& renderer, char* indent);
133a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1347953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API size_t getSize();
135bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
136bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void outputLogBuffer(int fd);
137bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
138bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
13965b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
1406554943a1dd6854c0f4976900956e556767b49e1Romain Guy    status_t replay(OpenGLRenderer& renderer, uint32_t width, uint32_t height,
141a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            Rect& dirty, int32_t flags, uint32_t level = 0);
142b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
143ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
144ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
14504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    void setRenderable(bool renderable) {
14604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mIsRenderable = renderable;
14704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
14804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
14904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool isRenderable() const {
15004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        return mIsRenderable;
15104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
15204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
15313631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void setName(const char* name) {
15413631f3da855f200a151e7837ed9f6b079622b58Romain Guy        if (name) {
15513631f3da855f200a151e7837ed9f6b079622b58Romain Guy            mName.setTo(name);
15613631f3da855f200a151e7837ed9f6b079622b58Romain Guy        }
15713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    }
15813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
159a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setApplicationScale(float scale) {
160a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mApplicationScale = scale;
161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
162a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
163a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setClipChildren(bool clipChildren) {
164a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mClipChildren = clipChildren;
165a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
166a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
167a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setAlpha(float alpha) {
168a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (alpha != mAlpha) {
169a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mAlpha = alpha;
170a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMultipliedAlpha = (int)(255 * alpha);
171a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
172a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
173a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
174a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationX(float translationX) {
175a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationX != mTranslationX) {
176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationX = translationX;
177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
178a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
179a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
180a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
181a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
182a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
184a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
185a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
186a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationY(float translationY) {
187a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationY != mTranslationY) {
188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationY = translationY;
189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
196a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotation(float rotation) {
199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotation != mRotation) {
200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotation = rotation;
201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
202a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotation, 0)) {
203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION;
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION;
206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationX(float rotationX) {
211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationX != mRotationX) {
212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationX = rotationX;
213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationY(float rotationY) {
223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationY != mRotationY) {
224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationY = rotationY;
225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
233a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleX(float scaleX) {
235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleX != mScaleX) {
236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleX = scaleX;
237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
246a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleY(float scaleY) {
247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleY != mScaleY) {
248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleY = scaleY;
249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
258a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotX(float pivotX) {
259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotX = pivotX;
260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
261a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
267a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
268a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotY(float pivotY) {
270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotY = pivotY;
271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCameraDistance(float distance) {
281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (distance != mCameraDistance) {
282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mCameraDistance = distance;
283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mTransformCamera) {
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera = new Sk3DView();
286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D = new SkMatrix();
287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformCamera->setCameraLocation(0, 0, distance);
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeft(int left) {
293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft) {
294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTop(int top) {
303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (top != mTop) {
304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
308a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRight(int right) {
313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (right != mRight) {
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
320a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setBottom(int bottom) {
323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (bottom != mBottom) {
324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeftTop(int left, int top) {
333a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop) {
334a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
335a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
343a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
348a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
349a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
350a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
351a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
353a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
354a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
356a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
357a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
358a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetLeftRight(int offset) {
359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft += offset;
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight += offset;
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetTopBottom(int offset) {
369a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop += offset;
371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom += offset;
372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
377a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
378a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCaching(bool caching) {
379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mCaching = caching;
380a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void transformRect(float left, float top, float right, float bottom, Rect& result);
383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
384b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
385b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
386b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
387a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void initProperties();
388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
389d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
390d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void updateMatrix();
392a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
393b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
394b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
395b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
401b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
402b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
403b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
404b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
4085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
4095c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4105c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4115c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
4125c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
415ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
416ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
417ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
418ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
41933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getIndex() {
420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
421b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
422b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
42333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getInt() {
424b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
426b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4277b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
4287b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
4297b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
4307b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
431b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
4325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
4362fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4395ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint* getPaint(OpenGLRenderer& renderer) {
4405ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        return renderer.filterPaint((SkPaint*) getInt());
441b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
442b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4430fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
4440fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
4450fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
450b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
451b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
452b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4564bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
4574bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
4584bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
4594bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
4604bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
46133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float* getFloats(int32_t& count) {
462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
469b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
470b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4715c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
472ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
473b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
474d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4752fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
476d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
47724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
478d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
48065b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
48165b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
48204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
48304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
48413631f3da855f200a151e7837ed9f6b079622b58Romain Guy
48513631f3da855f200a151e7837ed9f6b079622b58Romain Guy    String8 mName;
486a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
487a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    // View properties
488a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mApplicationScale;
489a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mClipChildren;
490a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mAlpha;
491a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mMultipliedAlpha;
492a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mTranslationX, mTranslationY;
493a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mRotation, mRotationX, mRotationY;
494a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mScaleX, mScaleY;
495a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mPivotX, mPivotY;
496a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mCameraDistance;
497a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mLeft, mTop, mRight, mBottom;
498a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mWidth, mHeight;
499a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mPrevWidth, mPrevHeight;
500a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mPivotExplicitlySet;
501a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixDirty;
502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixIsIdentity;
503a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    uint32_t mMatrixFlags;
504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix;
505a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* mTransformCamera;
506a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix3D;
507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mCaching;
508b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
509b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
510b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
511b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
512b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
513b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
514b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
515b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
516b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
517b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
518b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
5197953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
5207953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
521b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5227953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
5235977baa1fa24125c148a72699b53e62abaf08960Chet Haase
5247953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
5257953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
5267953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5286554943a1dd6854c0f4976900956e556767b49e1Romain Guy    virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty);
5294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5307953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
5317953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
532daf98e941e140e8739458126640183b9f296a2abChet Haase
5337953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
5347953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
5357953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
5364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5377953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
5385c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
5397953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
5405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
5414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5427953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
5437953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
5447953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
5457953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
5464aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5477953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
5487953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
5494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5507953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
5514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5526554943a1dd6854c0f4976900956e556767b49e1Romain Guy    virtual status_t drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
55333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            Rect& dirty, int32_t flags, uint32_t level = 0);
5547953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
5557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
5567953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
5577953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
5584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
5595c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
5607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
5615a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
5627953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
5634bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
5645c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
5657953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
5667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
5677953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
56801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
5697953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
5707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
5717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
5728b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
5737953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
5747953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
5757953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
5767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
577acdd4b9c4b03bc6660274ab878731383adb5bca5Romain Guy            SkPaint* paint, float length = -1.0f);
578325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
579325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            float hOffset, float vOffset, SkPaint* paint);
580eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
581eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            SkPaint* paint);
5824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
5847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
5854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
5877953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
5884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5897953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
5907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
5914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5925ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
5935ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
5945ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
5957953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
597b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
598b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
599b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
600b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6015c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
6025c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
603b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
604b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
605d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
606d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
607d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
608d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
60924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
61024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
611b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
612b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
613d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
614d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
6155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
6165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
6172fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
6182fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
6192fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
6202fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
621d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
622d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
623b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
624b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
62627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
62727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
62827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
62927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
63027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
63127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
63227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
63327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
63433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void insertTranlate() {
63533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (mHasTranslate) {
63633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
63733f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mWriter.writeInt(DisplayList::Translate);
63833f6beb10f98e8ba96250e284876d607055d278dRomain Guy                addPoint(mTranslateX, mTranslateY);
63933f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mTranslateX = mTranslateY = 0.0f;
64033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
64133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mHasTranslate = false;
64233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
64333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
64433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
64533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addOp(const DisplayList::Op drawOp) {
64627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
64733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
6484aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
64904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
6504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
65233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) {
65333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertRestoreToCount();
65433f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
65533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (reject) {
65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp);
658ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            mWriter.writeInt(0xdeaddead);
659390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            mBufferSize = mWriter.size();
660390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            return mWriter.peek32(mBufferSize - sizeof(int32_t));
66133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
66233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mWriter.writeInt(drawOp);
66333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return NULL;
66433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
66533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
66633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addSkip(uint32_t* location) {
66733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (location) {
668390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            *location = (int32_t) (mWriter.size() - mBufferSize);
66933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
67033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
67133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
67233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addInt(int32_t value) {
6734aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
6744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6754aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6767b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
6777b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
6787b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
6797b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
6807b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
6814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
682b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
6834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
6844bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
6854bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
6864bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
6874bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
6884bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
6894bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
6904bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
6914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
6924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
6934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6944aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
6964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
69933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void addFloats(const float* values, int32_t count) {
700b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
70133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        for (int32_t i = 0; i < count; i++) {
7024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
7034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
7154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7232fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
7242fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
7252fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
7262fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
7272fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
7282fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
7302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
731b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
7324bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            pathCopy->setSourcePath(path);
73396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
73496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
735b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7382fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
7394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7415c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
74224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
7430fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
744d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
745d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7460fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
74722d418437e44587cb0fba4353515719453269189Romain Guy        SkPaint* paintCopy = mPaintMap.valueFor(paint);
748d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
749d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
75096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
75196ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPaintMap.replaceValueFor(paint, paintCopy);
752d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
753d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7540fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
7560fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
7570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
7590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
7600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
7610fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
7620fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
7634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7655c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
766d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
767d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
768f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
769f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
770f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
7714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
774d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
775d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
776d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
777d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
7780fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
7795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
780d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
7815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
7824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
78424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
78524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
78624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
78724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
78824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
78924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
79024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
7911f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
79224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
79396ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
79496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mShaderMap.replaceValueFor(shader, shaderCopy);
7951f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
79643ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
79724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
79824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
79924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
8004aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
8014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
802ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
8030fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
804ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
805d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
806ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
807ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
8085c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
809ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
8104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
811d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
8120fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
81324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
8142fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
8152fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
8162fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
81724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
81824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
81924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
820d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
821d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
8224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
823390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy    uint32_t mBufferSize;
8244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
82527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
82633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
82733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
82833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
82933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool mHasTranslate;
83033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
83104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
83227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
833b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
834b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
8354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
8364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
8384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
8394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8405b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
841