DisplayListRenderer.h revision db8c9a6a4d9bf8c39f834b25611926caf21380f6
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.
548d56b0e1d24f7392314df4be6503af395a843696Chet Haase#define USE_DISPLAY_LIST_PROPERTIES 1
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 setClipChildren(bool clipChildren) {
160a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mClipChildren = clipChildren;
161a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
162a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    void setStaticMatrix(SkMatrix* matrix) {
1649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mStaticMatrix;
1659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mStaticMatrix = new SkMatrix(*matrix);
1669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    void setAnimationMatrix(SkMatrix* matrix) {
1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mAnimationMatrix;
1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        if (matrix) {
1719420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            mAnimationMatrix = new SkMatrix(*matrix);
1729420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        } else {
1739420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            mAnimationMatrix = NULL;
1749420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1759420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1769420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setAlpha(float alpha) {
178a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (alpha != mAlpha) {
179a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mAlpha = alpha;
180a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMultipliedAlpha = (int)(255 * alpha);
181a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
182a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
184db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    void setHasOverlappingRendering(bool hasOverlappingRendering) {
185db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        mHasOverlappingRendering = hasOverlappingRendering;
186db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
187db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationX(float translationX) {
189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationX != mTranslationX) {
190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationX = translationX;
191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
196a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationY(float translationY) {
201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationY != mTranslationY) {
202a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationY = translationY;
203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotation(float rotation) {
213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotation != mRotation) {
214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotation = rotation;
215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotation, 0)) {
217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION;
218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION;
220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationX(float rotationX) {
225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationX != mRotationX) {
226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationX = rotationX;
227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
233a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationY(float rotationY) {
237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationY != mRotationY) {
238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationY = rotationY;
239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
246a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleX(float scaleX) {
249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleX != mScaleX) {
250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleX = scaleX;
251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
258a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleY(float scaleY) {
261a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleY != mScaleY) {
262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleY = scaleY;
263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
267a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
268a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotX(float pivotX) {
273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotX = pivotX;
274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotY(float pivotY) {
284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotY = pivotY;
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCameraDistance(float distance) {
295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (distance != mCameraDistance) {
296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mCameraDistance = distance;
297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mTransformCamera) {
299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera = new Sk3DView();
300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D = new SkMatrix();
301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformCamera->setCameraLocation(0, 0, distance);
303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeft(int left) {
307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft) {
308a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTop(int top) {
317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (top != mTop) {
318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
320a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRight(int right) {
327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (right != mRight) {
328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
333a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
334a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
335a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setBottom(int bottom) {
337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (bottom != mBottom) {
338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
343a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeftTop(int left, int top) {
347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop) {
348a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
349a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
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 setLeftTopRightBottom(int left, int top, int right, int bottom) {
359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
369a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetLeftRight(int offset) {
373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft += offset;
375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight += offset;
376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
377a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
378a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
380a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetTopBottom(int offset) {
383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
384a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop += offset;
385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom += offset;
386a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
387a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
390a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
391a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
392a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCaching(bool caching) {
393a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mCaching = caching;
394a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
395a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
396b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
397b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
399a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void initProperties();
400a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
401d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
402d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
403a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void updateMatrix();
404a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
405b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
406b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
418b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
419b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
4205c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
4215c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
4245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
425b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
426b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
427ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
428ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
429ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
430ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
43133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getIndex() {
432b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
433b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
43533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getInt() {
436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
437b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4397b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
4407b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
4417b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
4427b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
443b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
4445c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
445b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
446b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
4482fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
450b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4515ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint* getPaint(OpenGLRenderer& renderer) {
4525ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        return renderer.filterPaint((SkPaint*) getInt());
453b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
454b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4550fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
4560fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
4570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
459b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
460b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4684bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
4694bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
4704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
4714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
4724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
47333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float* getFloats(int32_t& count) {
474b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
475b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4835c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
484ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
485b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
486d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4872fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
488d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
48924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
490d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
491b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
49265b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
49365b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
49404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
49504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
49613631f3da855f200a151e7837ed9f6b079622b58Romain Guy
49713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    String8 mName;
498a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
499a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    // View properties
500a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mClipChildren;
501a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mAlpha;
502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mMultipliedAlpha;
503db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    bool mHasOverlappingRendering;
504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mTranslationX, mTranslationY;
505a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mRotation, mRotationX, mRotationY;
506a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mScaleX, mScaleY;
507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mPivotX, mPivotY;
508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mCameraDistance;
509a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mLeft, mTop, mRight, mBottom;
510a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mWidth, mHeight;
511a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mPrevWidth, mPrevHeight;
512a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mPivotExplicitlySet;
513a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixDirty;
514a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixIsIdentity;
515a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    uint32_t mMatrixFlags;
516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix;
517a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* mTransformCamera;
518a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix3D;
5199420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    SkMatrix* mStaticMatrix;
5209420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    SkMatrix* mAnimationMatrix;
521a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mCaching;
522b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
523b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
524b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
526b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
528b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
531b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
5337953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
5347953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
535b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5367953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
5375977baa1fa24125c148a72699b53e62abaf08960Chet Haase
5387953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
5397953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
5407953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
541b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5426554943a1dd6854c0f4976900956e556767b49e1Romain Guy    virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty);
5434aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5447953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
5457953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
546daf98e941e140e8739458126640183b9f296a2abChet Haase
5477953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
5487953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
5497953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
5504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5517953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
5525c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
5537953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
5545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
5554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5567953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
5577953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
5587953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
5597953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
5604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5617953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
5627953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
5634aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5647953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5666554943a1dd6854c0f4976900956e556767b49e1Romain Guy    virtual status_t drawDisplayList(DisplayList* displayList, uint32_t width, uint32_t height,
56733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            Rect& dirty, int32_t flags, uint32_t level = 0);
5687953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
5697953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
5707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
5717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
5724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
5735c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
5747953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
5755a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
5767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
5774bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
5785c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
5797953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
5807953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
5817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
58201d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
5837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
5847953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
5857953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
5868b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
5877953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
5887953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
5897953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
5907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
591acdd4b9c4b03bc6660274ab878731383adb5bca5Romain Guy            SkPaint* paint, float length = -1.0f);
592325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
593325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            float hOffset, float vOffset, SkPaint* paint);
594eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
595eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            SkPaint* paint);
5964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5977953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
5987953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
5994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6007953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
6017953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
6024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6037953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
6047953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
6054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6065ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
6075ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6097953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
6104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
611b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
612b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6155c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
6165c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
617b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
618b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
619d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
620d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
621d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
622d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
62324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
62424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
625b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
626b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
627d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
628d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
6295c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
6305c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
6312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
6322fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
6332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
6342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
635d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
636d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
637b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
638b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6394aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
64027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
64127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
64227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
64327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
64427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
64527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
64627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
64727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
64833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void insertTranlate() {
64933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (mHasTranslate) {
65033f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
65133f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mWriter.writeInt(DisplayList::Translate);
65233f6beb10f98e8ba96250e284876d607055d278dRomain Guy                addPoint(mTranslateX, mTranslateY);
65333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mTranslateX = mTranslateY = 0.0f;
65433f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
65533f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mHasTranslate = false;
65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
65833f6beb10f98e8ba96250e284876d607055d278dRomain Guy
65933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addOp(const DisplayList::Op drawOp) {
66027454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
66133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
6624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
66304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
6644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
66633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) {
66733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertRestoreToCount();
66833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
66933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
67033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (reject) {
67133f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp);
672ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            mWriter.writeInt(0xdeaddead);
673390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            mBufferSize = mWriter.size();
674390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            return mWriter.peek32(mBufferSize - sizeof(int32_t));
67533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
67633f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mWriter.writeInt(drawOp);
67733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return NULL;
67833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
67933f6beb10f98e8ba96250e284876d607055d278dRomain Guy
68033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addSkip(uint32_t* location) {
68133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (location) {
682390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            *location = (int32_t) (mWriter.size() - mBufferSize);
68333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
68433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
68533f6beb10f98e8ba96250e284876d607055d278dRomain Guy
68633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addInt(int32_t value) {
6874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
6884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6907b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
6917b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
6927b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
6937b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
6947b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
6954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
696b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
6984bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
6994bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
7004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
7014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
7024bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
7034bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
7044bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
7054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
7064aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
71333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void addFloats(const float* values, int32_t count) {
714b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
71533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        for (int32_t i = 0; i < count; i++) {
7164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
7174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
7274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
7284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
7294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
7334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
7344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7372fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
7382fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
7392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
7402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
7412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
7422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
7442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
745b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
7464bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            pathCopy->setSourcePath(path);
74796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
74896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
749b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
7504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7512fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7522fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
7534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7555c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
75624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
7570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
758d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
759d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
76122d418437e44587cb0fba4353515719453269189Romain Guy        SkPaint* paintCopy = mPaintMap.valueFor(paint);
762d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
763d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
76496ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
76596ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPaintMap.replaceValueFor(paint, paintCopy);
766d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
767d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7680fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7690fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
7700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
7710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
7730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
7740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
7750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
7760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
7774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7795c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
780d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
781d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
782f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
783f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
784f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
7854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7875c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
788d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
789d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
790d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
791d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
7920fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
7935c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
794d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
7955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
7964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
79824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
79924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
80024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
80124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
80224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
80324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
80424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
8051f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
80624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
80796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
80896ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mShaderMap.replaceValueFor(shader, shaderCopy);
8091f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
81043ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
81124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
81224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
81324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
8144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
8154aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
816ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
8170fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
818ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
819d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
820ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
821ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
8225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
823ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
8244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
825d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
8260fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
82724c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
8282fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
8292fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
8302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
83124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
83224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
83324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
834d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
835d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
8364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
837390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy    uint32_t mBufferSize;
8384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
83927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
84033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
84133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
84233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool mHasTranslate;
84433f6beb10f98e8ba96250e284876d607055d278dRomain Guy
84504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
84627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
847b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
848b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
8494aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
8504aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
8524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
8534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8545b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
855