DisplayListRenderer.h revision d3efd6920e64d0207a0655640297d87d4937ee27
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#define TRANSLATION 0x0001
53a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION    0x0002
54a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define ROTATION_3D 0x0004
55a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define SCALE       0x0008
56a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase#define PIVOT       0x0010
57a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
584aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
59b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Display list
604aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy///////////////////////////////////////////////////////////////////////////////
614aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
62b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer;
63b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy/**
65b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Replays recorded drawing commands.
664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy */
67b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayList {
684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guypublic:
69b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    DisplayList(const DisplayListRenderer& recorder);
707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API ~DisplayList();
714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
72ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    // IMPORTANT: Update the intialization of OP_NAMES in the .cpp file
73ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    //            when modifying this file
744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    enum Op {
7504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Non-drawing operations
762b1847ea60650a9f68372abe860415f18b55081dRomain Guy        Save = 0,
774aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Restore,
784aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        RestoreToCount,
794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SaveLayer,
805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        SaveLayerAlpha,
814aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Translate,
824aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Rotate,
834aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        Scale,
84807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy        Skew,
854aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetMatrix,
864aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ConcatMatrix,
874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ClipRect,
8804c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        // Drawing operations
890fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        DrawDisplayList,
906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        DrawLayer,
914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmap,
924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapMatrix,
934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawBitmapRect,
945a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        DrawBitmapMesh,
954aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPatch,
964aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawColor,
974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawRect,
9801d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawRoundRect,
9901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy        DrawCircle,
100c1cd9ba335b293f11e1082447ef08e474710a05fRomain Guy        DrawOval,
1018b2f5267f16c295f12faab810527cd6311997e34Romain Guy        DrawArc,
1024aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawPath,
1034aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawLines,
104ed6fcb034b44d9a6ac2fc72fee6030417811f234Romain Guy        DrawPoints,
1054aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        DrawText,
106325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy        DrawTextOnPath,
107eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy        DrawPosText,
1084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShader,
1094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupShader,
1104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetColorFilter,
1114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        SetupColorFilter,
1124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        ResetShadow,
113ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy        SetupShadow,
1145ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        ResetPaintFilter,
1155ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        SetupPaintFilter,
116daf98e941e140e8739458126640183b9f296a2abChet Haase        DrawGLFunction,
1174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    };
1184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
11933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    // See flags defined in DisplayList.java
12033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    enum ReplayFlag {
12133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        kReplayFlag_ClipChildren = 0x1
12233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    };
12333f6beb10f98e8ba96250e284876d607055d278dRomain Guy
124ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy    static const char* OP_NAMES[];
125ffac7fc5042296a459d0f5a450dbfe20917093dcRomain Guy
1261271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    void setViewProperties(OpenGLRenderer& renderer, uint32_t level);
127a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void outputViewProperties(OpenGLRenderer& renderer, char* indent);
128a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1297953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API size_t getSize();
130bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
131bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    ANDROID_API static void outputLogBuffer(int fd);
132bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy
133bb0acdf9e1d862a7cf0e2533321fc1105c29b5e3Romain Guy    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
13465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
1351271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    status_t replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level = 0);
136b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
137ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase    void output(OpenGLRenderer& renderer, uint32_t level = 0);
138ed30fd8e9a2d65ee5c8520de55b0089c219f390cChet Haase
13904c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    void setRenderable(bool renderable) {
14004c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mIsRenderable = renderable;
14104c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
14204c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
14304c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool isRenderable() const {
14404c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        return mIsRenderable;
14504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    }
14604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
14713631f3da855f200a151e7837ed9f6b079622b58Romain Guy    void setName(const char* name) {
14813631f3da855f200a151e7837ed9f6b079622b58Romain Guy        if (name) {
14913631f3da855f200a151e7837ed9f6b079622b58Romain Guy            mName.setTo(name);
15013631f3da855f200a151e7837ed9f6b079622b58Romain Guy        }
15113631f3da855f200a151e7837ed9f6b079622b58Romain Guy    }
15213631f3da855f200a151e7837ed9f6b079622b58Romain Guy
153a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setClipChildren(bool clipChildren) {
154a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mClipChildren = clipChildren;
155a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
156a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
1579420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    void setStaticMatrix(SkMatrix* matrix) {
1589420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mStaticMatrix;
1599420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        mStaticMatrix = new SkMatrix(*matrix);
1609420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1619420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
1629420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    void setAnimationMatrix(SkMatrix* matrix) {
1639420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        delete mAnimationMatrix;
1649420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        if (matrix) {
1659420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            mAnimationMatrix = new SkMatrix(*matrix);
1669420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        } else {
1679420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase            mAnimationMatrix = NULL;
1689420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase        }
1699420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    }
1709420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase
171a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setAlpha(float alpha) {
172a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (alpha != mAlpha) {
173a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mAlpha = alpha;
174a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMultipliedAlpha = (int)(255 * alpha);
175a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
176a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
177a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
178db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    void setHasOverlappingRendering(bool hasOverlappingRendering) {
179db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase        mHasOverlappingRendering = hasOverlappingRendering;
180db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    }
181db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase
182a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationX(float translationX) {
183a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationX != mTranslationX) {
184a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationX = translationX;
185a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
186a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
187a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
188a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
189a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
190a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
191a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
192a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
193a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
194a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTranslationY(float translationY) {
195a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (translationY != mTranslationY) {
196a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTranslationY = translationY;
197a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
198a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
199a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~TRANSLATION;
200a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
201a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= TRANSLATION;
202a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
203a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
204a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
205a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
206a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotation(float rotation) {
207a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotation != mRotation) {
208a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotation = rotation;
209a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
210a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotation, 0)) {
211a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION;
212a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
213a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION;
214a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
215a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
216a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
217a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
218a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationX(float rotationX) {
219a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationX != mRotationX) {
220a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationX = rotationX;
221a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
222a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
223a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
224a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
225a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
226a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
227a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
228a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
229a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
230a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRotationY(float rotationY) {
231a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (rotationY != mRotationY) {
232a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRotationY = rotationY;
233a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
234a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
235a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~ROTATION_3D;
236a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
237a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= ROTATION_3D;
238a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
239a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
240a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
241a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
242a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleX(float scaleX) {
243a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleX != mScaleX) {
244a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleX = scaleX;
245a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
246a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
247a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
248a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
249a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
250a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
251a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
252a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
253a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
254a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setScaleY(float scaleY) {
255a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (scaleY != mScaleY) {
256a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mScaleY = scaleY;
257a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
258d3efd6920e64d0207a0655640297d87d4937ee27Chet Haase            if (mScaleX == 1.0f && mScaleY == 1.0f) {
259a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags &= ~SCALE;
260a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            } else {
261a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixFlags |= SCALE;
262a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
263a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
264a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
265a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
266a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotX(float pivotX) {
267a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotX = pivotX;
268a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
269a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
270a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
271a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
272a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
273a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
274a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
275a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
276a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
277a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setPivotY(float pivotY) {
278a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotY = pivotY;
279a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mMatrixDirty = true;
280a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
281a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags &= ~PIVOT;
282a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        } else {
283a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixFlags |= PIVOT;
284a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
285a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mPivotExplicitlySet = true;
286a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
287a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
288a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCameraDistance(float distance) {
289a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (distance != mCameraDistance) {
290a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mCameraDistance = distance;
291a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mMatrixDirty = true;
292a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (!mTransformCamera) {
293a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformCamera = new Sk3DView();
294a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mTransformMatrix3D = new SkMatrix();
295a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
296a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTransformCamera->setCameraLocation(0, 0, distance);
297a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
298a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
299a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
300a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeft(int left) {
301a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft) {
302a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
303a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
304a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
305a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
306a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
307a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
308a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
309a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
310a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setTop(int top) {
311a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (top != mTop) {
312a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
313a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
314a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
315a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
316a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
317a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
318a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
319a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
320a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setRight(int right) {
321a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (right != mRight) {
322a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
323a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
324a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
325a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
326a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
327a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
328a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
329a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
330a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setBottom(int bottom) {
331a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (bottom != mBottom) {
332a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
333a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
334a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
335a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
336a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
337a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
338a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
339a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
340a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeftTop(int left, int top) {
341a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop) {
342a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
343a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
344a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
345a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
346a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
347a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
348a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
349a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
350a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
351a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
352a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
353a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
354a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft = left;
355a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop = top;
356a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight = right;
357a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom = bottom;
358a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mWidth = mRight - mLeft;
359a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mHeight = mBottom - mTop;
360a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
361a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
362a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
363a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
364a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
365a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
366a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetLeftRight(int offset) {
367a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
368a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mLeft += offset;
369a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mRight += offset;
370a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
371a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
372a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
373a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
374a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
375a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
376a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void offsetTopBottom(int offset) {
377a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        if (offset != 0) {
378a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mTop += offset;
379a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            mBottom += offset;
380a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
381a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase                mMatrixDirty = true;
382a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase            }
383a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        }
384a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
385a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
386a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void setCaching(bool caching) {
387a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase        mCaching = caching;
388a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    }
389a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
3901271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int getWidth() {
3911271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        return mWidth;
3921271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
3931271e2cc80b01d577e9db339459ef0222bb9320dChet Haase
3941271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    int getHeight() {
3951271e2cc80b01d577e9db339459ef0222bb9320dChet Haase        return mHeight;
3961271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    }
3971271e2cc80b01d577e9db339459ef0222bb9320dChet Haase
398b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyprivate:
399b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void init();
400b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
401a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void initProperties();
402a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
403d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase    void clearResources();
404d63cbd10765e8f48e39b07b15f0a4b70bf853ec8Chet Haase
405a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    void updateMatrix();
406a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
407b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    class TextContainer {
408b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    public:
409b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length() const {
410b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return mByteLength;
411b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
412b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
413b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* text() const {
414b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy            return (const char*) mText;
415b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        }
416b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
417b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t mByteLength;
418b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        const char* mText;
419b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    };
420b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
421b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkBitmap* getBitmap() {
4225c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkBitmap*) getInt();
4235c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
4245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
4255c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SkiaShader* getShader() {
4265c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkiaShader*) getInt();
427b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
428b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
429ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    SkiaColorFilter* getColorFilter() {
430ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        return (SkiaColorFilter*) getInt();
431ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
432ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
43333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getIndex() {
434b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
435b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
436b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
43733f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline int32_t getInt() {
438b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readInt();
439b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
440b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4417b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline uint32_t getUInt() {
4427b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        return mReader.readU32();
4437b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
4447b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
445b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkMatrix* getMatrix() {
4465c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return (SkMatrix*) getInt();
447b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
448b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
449b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    SkPath* getPath() {
4502fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return (SkPath*) getInt();
451b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
452b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4535ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    SkPaint* getPaint(OpenGLRenderer& renderer) {
4545ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        return renderer.filterPaint((SkPaint*) getInt());
455b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
456b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4570fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DisplayList* getDisplayList() {
4580fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        return (DisplayList*) getInt();
4590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
4600fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
461b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    inline float getFloat() {
462b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mReader.readScalar();
463b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
464b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
465b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int32_t* getInts(uint32_t& count) {
466b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
467b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (int32_t*) mReader.skip(count * sizeof(int32_t));
468b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
469b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4704bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    uint32_t* getUInts(int8_t& count) {
4714bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        count = getInt();
4724bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        return (uint32_t*) mReader.skip(count * sizeof(uint32_t));
4734bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
4744bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
47533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float* getFloats(int32_t& count) {
476b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        count = getInt();
477b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return (float*) mReader.skip(count * sizeof(float));
478b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
479b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
480b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    void getText(TextContainer* text) {
481b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        size_t length = text->mByteLength = getInt();
482b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        text->mText = (const char*) mReader.skip(length);
483b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
484b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
4855c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
486ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
487b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
488d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
4892fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
490d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
49124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
492d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
493b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    mutable SkFlattenableReadBuffer mReader;
49465b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy
49565b345fa22b878e141b8fd8ece9c208df00fa40fRomain Guy    size_t mSize;
49604c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy
49704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mIsRenderable;
49813631f3da855f200a151e7837ed9f6b079622b58Romain Guy
49913631f3da855f200a151e7837ed9f6b079622b58Romain Guy    String8 mName;
500a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase
501a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    // View properties
502a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mClipChildren;
503a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mAlpha;
504a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mMultipliedAlpha;
505db8c9a6a4d9bf8c39f834b25611926caf21380f6Chet Haase    bool mHasOverlappingRendering;
506a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mTranslationX, mTranslationY;
507a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mRotation, mRotationX, mRotationY;
508a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mScaleX, mScaleY;
509a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mPivotX, mPivotY;
510a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    float mCameraDistance;
511a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mLeft, mTop, mRight, mBottom;
512a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mWidth, mHeight;
513a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    int mPrevWidth, mPrevHeight;
514a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mPivotExplicitlySet;
515a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixDirty;
516a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mMatrixIsIdentity;
517a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    uint32_t mMatrixFlags;
518a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix;
519a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    Sk3DView* mTransformCamera;
520a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    SkMatrix* mTransformMatrix3D;
5219420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    SkMatrix* mStaticMatrix;
5229420abd56a2af7ddbeb70562b79d61b2dca8c5a1Chet Haase    SkMatrix* mAnimationMatrix;
523a1cff5043d0fbd78fcf9c48e7658e56a5b0c2de3Chet Haase    bool mCaching;
524b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy};
525b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
526b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
527b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy// Renderer
528b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy///////////////////////////////////////////////////////////////////////////////
529b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
530b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy/**
531b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy * Records drawing commands in a display list for latter playback.
532b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy */
533b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guyclass DisplayListRenderer: public OpenGLRenderer {
534b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guypublic:
5357953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayListRenderer();
5367953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual ~DisplayListRenderer();
537b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5387953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API DisplayList* getDisplayList(DisplayList* displayList);
5395977baa1fa24125c148a72699b53e62abaf08960Chet Haase
5407953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setViewport(int width, int height);
5417953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void prepareDirty(float left, float top, float right, float bottom, bool opaque);
5427953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void finish();
543b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
5446554943a1dd6854c0f4976900956e556767b49e1Romain Guy    virtual status_t callDrawGLFunction(Functor *functor, Rect& dirty);
5454aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5467953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void interrupt();
5477953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resume();
548daf98e941e140e8739458126640183b9f296a2abChet Haase
5497953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int save(int flags);
5507953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restore();
5517953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void restoreToCount(int saveCount);
5524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5537953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayer(float left, float top, float right, float bottom,
5545c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            SkPaint* p, int flags);
5557953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual int saveLayerAlpha(float left, float top, float right, float bottom,
5565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy                int alpha, int flags);
5574aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5587953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void translate(float dx, float dy);
5597953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void rotate(float degrees);
5607953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void scale(float sx, float sy);
5617953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void skew(float sx, float sy);
5624aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5637953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setMatrix(SkMatrix* matrix);
5647953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void concatMatrix(SkMatrix* matrix);
5654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5667953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
5674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5681271e2cc80b01d577e9db339459ef0222bb9320dChet Haase    virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags,
5691271e2cc80b01d577e9db339459ef0222bb9320dChet Haase            uint32_t level = 0);
5707953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
5717953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
5727953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
5737953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
5744aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            float srcRight, float srcBottom, float dstLeft, float dstTop,
5755c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float dstRight, float dstBottom, SkPaint* paint);
5767953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
5775a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy            float* vertices, int* colors, SkPaint* paint);
5787953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
5794bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
5805c13d89c1332fcc499379b9064b891187b75ca32Chet Haase            float left, float top, float right, float bottom, SkPaint* paint);
5817953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawColor(int color, SkXfermode::Mode mode);
5827953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
5837953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawRoundRect(float left, float top, float right, float bottom,
58401d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy            float rx, float ry, SkPaint* paint);
5857953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
5867953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
5877953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawArc(float left, float top, float right, float bottom,
5888b2f5267f16c295f12faab810527cd6311997e34Romain Guy            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
5897953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPath(SkPath* path, SkPaint* paint);
5907953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawLines(float* points, int count, SkPaint* paint);
5917953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawPoints(float* points, int count, SkPaint* paint);
5927953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
593acdd4b9c4b03bc6660274ab878731383adb5bca5Romain Guy            SkPaint* paint, float length = -1.0f);
594325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
595325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy            float hOffset, float vOffset, SkPaint* paint);
596eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy    virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
597eb9a5367e8f0e970db8509ffb2584f5376bc62edRomain Guy            SkPaint* paint);
5984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
5997953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShader();
6007953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShader(SkiaShader* shader);
6014aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6027953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetColorFilter();
6037953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupColorFilter(SkiaColorFilter* filter);
6044aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6057953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void resetShadow();
6067953745dd565167113f8cbfc461bc0521d32d870Romain Guy    virtual void setupShadow(float radius, float dx, float dy, int color);
6074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6085ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void resetPaintFilter();
6095ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    virtual void setupPaintFilter(int clearBits, int setBits);
6105ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy
6117953745dd565167113f8cbfc461bc0521d32d870Romain Guy    ANDROID_API void reset();
6124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
613b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    const SkWriter32& writeStream() const {
614b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        return mWriter;
615b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
616b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6175c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    const Vector<SkBitmap*>& getBitmapResources() const {
6185c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        return mBitmapResources;
619b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
620b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
621d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    const Vector<SkiaColorFilter*>& getFilterResources() const {
622d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        return mFilterResources;
623d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy    }
624d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy
62524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    const Vector<SkiaShader*>& getShaders() const {
62624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        return mShaders;
627b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
628b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
629d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkPaint*>& getPaints() const {
630d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mPaints;
6315c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
6325c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
6332fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    const Vector<SkPath*>& getPaths() const {
6342fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        return mPaths;
6352fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    }
6362fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
637d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    const Vector<SkMatrix*>& getMatrices() const {
638d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        return mMatrices;
639b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    }
640b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
6414aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guyprivate:
64227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    void insertRestoreToCount() {
64327454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        if (mRestoreSaveCount >= 0) {
64427454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mWriter.writeInt(DisplayList::RestoreToCount);
64527454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            addInt(mRestoreSaveCount);
64627454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy            mRestoreSaveCount = -1;
64727454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        }
64827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    }
64927454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
65033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void insertTranlate() {
65133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (mHasTranslate) {
65233f6beb10f98e8ba96250e284876d607055d278dRomain Guy            if (mTranslateX != 0.0f || mTranslateY != 0.0f) {
65333f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mWriter.writeInt(DisplayList::Translate);
65433f6beb10f98e8ba96250e284876d607055d278dRomain Guy                addPoint(mTranslateX, mTranslateY);
65533f6beb10f98e8ba96250e284876d607055d278dRomain Guy                mTranslateX = mTranslateY = 0.0f;
65633f6beb10f98e8ba96250e284876d607055d278dRomain Guy            }
65733f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mHasTranslate = false;
65833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
65933f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
66033f6beb10f98e8ba96250e284876d607055d278dRomain Guy
66133f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addOp(const DisplayList::Op drawOp) {
66227454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy        insertRestoreToCount();
66333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
6644aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(drawOp);
66504c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
6664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6674aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
66833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    uint32_t* addOp(const DisplayList::Op drawOp, const bool reject) {
66933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertRestoreToCount();
67033f6beb10f98e8ba96250e284876d607055d278dRomain Guy        insertTranlate();
67133f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mHasDrawOps = mHasDrawOps || drawOp >= DisplayList::DrawDisplayList;
67233f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (reject) {
67333f6beb10f98e8ba96250e284876d607055d278dRomain Guy            mWriter.writeInt(OP_MAY_BE_SKIPPED_MASK | drawOp);
674ad1daaa87b793af30f3dd67a0f3cd5c0fd6ac0c1Romain Guy            mWriter.writeInt(0xdeaddead);
675390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            mBufferSize = mWriter.size();
676390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            return mWriter.peek32(mBufferSize - sizeof(int32_t));
67733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
67833f6beb10f98e8ba96250e284876d607055d278dRomain Guy        mWriter.writeInt(drawOp);
67933f6beb10f98e8ba96250e284876d607055d278dRomain Guy        return NULL;
68033f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
68133f6beb10f98e8ba96250e284876d607055d278dRomain Guy
68233f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addSkip(uint32_t* location) {
68333f6beb10f98e8ba96250e284876d607055d278dRomain Guy        if (location) {
684390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy            *location = (int32_t) (mWriter.size() - mBufferSize);
68533f6beb10f98e8ba96250e284876d607055d278dRomain Guy        }
68633f6beb10f98e8ba96250e284876d607055d278dRomain Guy    }
68733f6beb10f98e8ba96250e284876d607055d278dRomain Guy
68833f6beb10f98e8ba96250e284876d607055d278dRomain Guy    inline void addInt(int32_t value) {
6894aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(value);
6904aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
6914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
6927b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    inline void addSize(uint32_t w, uint32_t h) {
6937b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(w);
6947b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy        mWriter.writeInt(h);
6957b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy    }
6967b5b6abf852c039983eded25ebe43a70fef5a4abRomain Guy
6974aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    void addInts(const int32_t* values, uint32_t count) {
698b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
6994aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        for (uint32_t i = 0; i < count; i++) {
7004bb942083a0d4db746adf95349108dd8ef842e32Romain Guy            mWriter.writeInt(values[i]);
7014bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        }
7024bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    }
7034bb942083a0d4db746adf95349108dd8ef842e32Romain Guy
7044bb942083a0d4db746adf95349108dd8ef842e32Romain Guy    void addUInts(const uint32_t* values, int8_t count) {
7054bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        mWriter.writeInt(count);
7064bb942083a0d4db746adf95349108dd8ef842e32Romain Guy        for (int8_t i = 0; i < count; i++) {
7074aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeInt(values[i]);
7084aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7094aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7104aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addFloat(float value) {
7124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(value);
7134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7144aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
71533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    void addFloats(const float* values, int32_t count) {
716b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy        mWriter.writeInt(count);
71733f6beb10f98e8ba96250e284876d607055d278dRomain Guy        for (int32_t i = 0; i < count; i++) {
7184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            mWriter.writeScalar(values[i]);
7194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7204aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7214aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7224aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addPoint(float x, float y) {
7234aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(x);
7244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(y);
7254aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7274aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addBounds(float left, float top, float right, float bottom) {
7284aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(left);
7294aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(top);
7304aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(right);
7314aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeScalar(bottom);
7324aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7334aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7344aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    inline void addText(const void* text, size_t byteLength) {
7354aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writeInt(byteLength);
7364aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        mWriter.writePad(text, byteLength);
7374aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7392fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    inline void addPath(SkPath* path) {
7402fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (!path) {
7412fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            addInt((int) NULL);
7422fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy            return;
7432fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        }
7442fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7452fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        SkPath* pathCopy = mPathMap.valueFor(path);
7462fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        if (pathCopy == NULL || pathCopy->getGenerationID() != path->getGenerationID()) {
747b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            pathCopy = new SkPath(*path);
7484bcb7467a174ed03a67b0c62950c555813ddf00dRomain Guy            pathCopy->setSourcePath(path);
74996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
75096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPathMap.replaceValueFor(path, pathCopy);
751b29cfbf768eab959b31410aafc0a99e20249e9d7Romain Guy            mPaths.add(pathCopy);
7524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
7532fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
7542fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy        addInt((int) pathCopy);
7554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7564aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7575c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addPaint(SkPaint* paint) {
75824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!paint) {
7590fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy            addInt((int) NULL);
760d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            return;
761d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7620fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
76322d418437e44587cb0fba4353515719453269189Romain Guy        SkPaint* paintCopy = mPaintMap.valueFor(paint);
764d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        if (paintCopy == NULL || paintCopy->getGenerationID() != paint->getGenerationID()) {
765d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            paintCopy = new SkPaint(*paint);
76696ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
76796ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mPaintMap.replaceValueFor(paint, paintCopy);
768d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase            mPaints.add(paintCopy);
769d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        }
7700fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7710fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) paintCopy);
7720fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    }
7730fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
7740fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    inline void addDisplayList(DisplayList* displayList) {
7750fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        // TODO: To be safe, the display list should be ref-counted in the
7760fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       resources cache, but we rely on the caller (UI toolkit) to
7770fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        //       do the right thing for now
7780fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) displayList);
7794aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7804aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7815c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addMatrix(SkMatrix* matrix) {
782d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Copying the matrix is cheap and prevents against the user changing the original
783d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // matrix before the operation that uses it
784f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        SkMatrix* copy = new SkMatrix(*matrix);
785f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        addInt((int) copy);
786f6a63ae3a7004a8eca87fca5a66cfb6aef4e86b5Romain Guy        mMatrices.add(copy);
7874aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
7884aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7895c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addBitmap(SkBitmap* bitmap) {
790d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // Note that this assumes the bitmap is immutable. There are cases this won't handle
791d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // correctly, such as creating the bitmap from scratch, drawing with it, changing its
792d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // contents, and drawing again. The only fix would be to always copy it the first time,
793d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase        // which doesn't seem worth the extra cycles for this unlikely case.
7940fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) bitmap);
7955c13d89c1332fcc499379b9064b891187b75ca32Chet Haase        mBitmapResources.add(bitmap);
796d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(bitmap);
7975c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    }
7984aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
7995c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    inline void addShader(SkiaShader* shader) {
80024c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        if (!shader) {
80124c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            addInt((int) NULL);
80224c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            return;
80324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
80424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
80524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        SkiaShader* shaderCopy = mShaderMap.valueFor(shader);
80624c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        // TODO: We also need to handle generation ID changes in compose shaders
8071f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy        if (shaderCopy == NULL || shaderCopy->getGenerationId() != shader->getGenerationId()) {
80824c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy            shaderCopy = shader->copy();
80996ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            // replaceValueFor() performs an add if the entry doesn't exist
81096ebc6b5097ab73eef45e094241e444f4c21bfccRomain Guy            mShaderMap.replaceValueFor(shader, shaderCopy);
8111f1fcb70b6e43a6b4df0dbab75a34429d4744624Romain Guy            mShaders.add(shaderCopy);
81243ccf4663c822ddd435b7683cc05221f6169c6c3Romain Guy            Caches::getInstance().resourceCache.incrementRefcount(shaderCopy);
81324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        }
81424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
81524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy        addInt((int) shaderCopy);
8164aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
8174aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
818ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    inline void addColorFilter(SkiaColorFilter* colorFilter) {
8190fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy        addInt((int) colorFilter);
820ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase        mFilterResources.add(colorFilter);
821d586ad9c9fec80aa1d24d6b53cd2c8d5b47fe868Romain Guy        Caches::getInstance().resourceCache.incrementRefcount(colorFilter);
822ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    }
823ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase
8245c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    Vector<SkBitmap*> mBitmapResources;
825ad93c2bb63dfc813b2eefa1043aa63afbddce655Chet Haase    Vector<SkiaColorFilter*> mFilterResources;
8264aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
827d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkPaint*> mPaints;
8280fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy    DefaultKeyedVector<SkPaint*, SkPaint*> mPaintMap;
82924c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
8302fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    Vector<SkPath*> mPaths;
8312fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy    DefaultKeyedVector<SkPath*, SkPath*> mPathMap;
8322fc941e4650d618ff6e122f28b616d9032ffa134Romain Guy
83324c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    Vector<SkiaShader*> mShaders;
83424c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy    DefaultKeyedVector<SkiaShader*, SkiaShader*> mShaderMap;
83524c00216687ac87fe531dc4d4168ac0c0ca04ea6Romain Guy
836d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase    Vector<SkMatrix*> mMatrices;
837d98aa2de9ab18e09c2be1997f41212740f51f6e6Chet Haase
8384aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SkWriter32 mWriter;
839390f882f8905e8d1ac0d4b7f2e01aa04dccc3c16Romain Guy    uint32_t mBufferSize;
8404aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
84127454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy    int mRestoreSaveCount;
84233f6beb10f98e8ba96250e284876d607055d278dRomain Guy
84333f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateX;
84433f6beb10f98e8ba96250e284876d607055d278dRomain Guy    float mTranslateY;
84533f6beb10f98e8ba96250e284876d607055d278dRomain Guy    bool mHasTranslate;
84633f6beb10f98e8ba96250e284876d607055d278dRomain Guy
84704c9d8c2ffd028c35c750bac0a4a7b79e48059b5Romain Guy    bool mHasDrawOps;
84827454a42de8b3c54cdd3b2b2a12446c2c10c8cb9Romain Guy
849b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    friend class DisplayList;
850b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy
8514aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // class DisplayListRenderer
8524aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8534aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace uirenderer
8544aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}; // namespace android
8554aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
8565b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_DISPLAY_LIST_RENDERER_H
857