10776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/*
20776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Copyright (C) 2013 The Android Open Source Project
30776a6069365bdea83855db154fa2d37f9d1d808Chris Craik *
40776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
50776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * you may not use this file except in compliance with the License.
60776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * You may obtain a copy of the License at
70776a6069365bdea83855db154fa2d37f9d1d808Chris Craik *
80776a6069365bdea83855db154fa2d37f9d1d808Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
90776a6069365bdea83855db154fa2d37f9d1d808Chris Craik *
100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Unless required by applicable law or agreed to in writing, software
110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * See the License for the specific language governing permissions and
140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * limitations under the License.
150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */
160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#ifndef ANDROID_HWUI_DISPLAY_LIST_H
180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define ANDROID_HWUI_DISPLAY_LIST_H
190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
207031ff68bb998dbbd7caf3b2fd75eef747a86725Romain Guy#ifndef LOG_TAG
217031ff68bb998dbbd7caf3b2fd75eef747a86725Romain Guy    #define LOG_TAG "OpenGLRenderer"
227031ff68bb998dbbd7caf3b2fd75eef747a86725Romain Guy#endif
237031ff68bb998dbbd7caf3b2fd75eef747a86725Romain Guy
240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <SkCamera.h>
250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <SkMatrix.h>
260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
27ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik#include <private/hwui/DrawGlInfo.h>
28ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
29c1c5f0870282b56dafe5a4d756e4b9e6884655a7Chris Craik#include <utils/LinearAllocator.h>
300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/RefBase.h>
310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/SortedVector.h>
320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/String8.h>
330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/Vector.h>
34e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <cutils/compiler.h>
360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
37e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy#include <androidfw/ResourceTypes.h>
38e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy
390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "Debug.h"
400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define TRANSLATION 0x0001
420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define ROTATION    0x0002
430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define ROTATION_3D 0x0004
440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define SCALE       0x0008
450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define PIVOT       0x0010
460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
470776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkBitmap;
480776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkPaint;
490776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkPath;
500776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkRegion;
510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
520776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace android {
530776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace uirenderer {
540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
55c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList;
560776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayListOp;
570776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayListRenderer;
580776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass OpenGLRenderer;
590776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass Rect;
600776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass Layer;
610776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkiaColorFilter;
620776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkiaShader;
630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
64ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass ClipRectOp;
65ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveLayerOp;
66ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveOp;
67ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass RestoreToCountOp;
68ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
69ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstruct DeferStateStruct {
70ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags)
71ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            : mDeferredList(deferredList), mRenderer(renderer), mReplayFlags(replayFlags) {}
72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    DeferredDisplayList& mDeferredList;
73ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    OpenGLRenderer& mRenderer;
74ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    const int mReplayFlags;
75ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik};
76ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
77ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstruct ReplayStateStruct {
78ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ReplayStateStruct(OpenGLRenderer& renderer, Rect& dirty, int replayFlags)
79ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            : mRenderer(renderer), mDirty(dirty), mReplayFlags(replayFlags),
80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            mDrawGlStatus(DrawGlInfo::kStatusDone) {}
81ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    OpenGLRenderer& mRenderer;
82ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    Rect& mDirty;
83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    const int mReplayFlags;
84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    status_t mDrawGlStatus;
85ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik};
86ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/**
880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Refcounted structure that holds data used in display list stream
890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */
90ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass DisplayListData : public LightRefBase<DisplayListData> {
910776a6069365bdea83855db154fa2d37f9d1d808Chris Craikpublic:
920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    LinearAllocator allocator;
930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<DisplayListOp*> displayListOps;
940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik};
950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/**
970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Replays recorded drawing commands.
980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */
990776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayList {
1000776a6069365bdea83855db154fa2d37f9d1d808Chris Craikpublic:
1010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    DisplayList(const DisplayListRenderer& recorder);
1020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API ~DisplayList();
1030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    // See flags defined in DisplayList.java
1050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    enum ReplayFlag {
1060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        kReplayFlag_ClipChildren = 0x1
1070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    };
1080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API size_t getSize();
1110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
1120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API static void outputLogBuffer(int fd);
1130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
116ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void defer(DeferStateStruct& deferStruct, const int level);
117ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void replay(ReplayStateStruct& replayStruct, const int level);
1180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void output(uint32_t level = 0);
1200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API void reset();
1220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRenderable(bool renderable) {
1240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mIsRenderable = renderable;
1250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool isRenderable() const {
1280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mIsRenderable;
1290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setName(const char* name) {
1320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (name) {
133450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy            char* lastPeriod = strrchr(name, '.');
134450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy            if (lastPeriod) {
135450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy                mName.setTo(lastPeriod + 1);
136450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy            } else {
137450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy                mName.setTo(name);
138450dc7554de90026a6dd2a1ec7108c1423fce18eRomain Guy            }
1390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
14252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    const char* getName() const {
14352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mName.string();
14452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
14552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
146dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase    void setClipToBounds(bool clipToBounds) {
147dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase        mClipToBounds = clipToBounds;
1480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setStaticMatrix(SkMatrix* matrix) {
1510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        delete mStaticMatrix;
1520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mStaticMatrix = new SkMatrix(*matrix);
1530776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
15552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    // Can return NULL
15652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    SkMatrix* getStaticMatrix() {
15752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mStaticMatrix;
15852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
15952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1600776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setAnimationMatrix(SkMatrix* matrix) {
1610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        delete mAnimationMatrix;
1620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (matrix) {
1630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAnimationMatrix = new SkMatrix(*matrix);
1640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
1650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAnimationMatrix = NULL;
1660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setAlpha(float alpha) {
1700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
1710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (alpha != mAlpha) {
1720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAlpha = alpha;
1730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
17652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getAlpha() const {
17752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mAlpha;
17852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
17952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1800776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setHasOverlappingRendering(bool hasOverlappingRendering) {
1810776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mHasOverlappingRendering = hasOverlappingRendering;
1820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
18452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    bool hasOverlappingRendering() const {
18552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mHasOverlappingRendering;
18652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
18752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTranslationX(float translationX) {
1890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (translationX != mTranslationX) {
1900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTranslationX = translationX;
1910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
1920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
1930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~TRANSLATION;
1940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
1950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= TRANSLATION;
1960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
1970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
20052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTranslationX() const {
20152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTranslationX;
20252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
20352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTranslationY(float translationY) {
2050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (translationY != mTranslationY) {
2060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTranslationY = translationY;
2070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
2090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~TRANSLATION;
2100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= TRANSLATION;
2120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
21652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTranslationY() const {
21752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTranslationY;
21852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
21952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotation(float rotation) {
2210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotation != mRotation) {
2220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotation = rotation;
2230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotation == 0.0f) {
2250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION;
2260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION;
2280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
23252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotation() const {
23352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotation;
23452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
23552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotationX(float rotationX) {
2370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotationX != mRotationX) {
2380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotationX = rotationX;
2390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotationX == 0.0f && mRotationY == 0.0f) {
2410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION_3D;
2420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION_3D;
2440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
24852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotationX() const {
24952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotationX;
25052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
25152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotationY(float rotationY) {
2530776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotationY != mRotationY) {
2540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotationY = rotationY;
2550776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2560776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotationX == 0.0f && mRotationY == 0.0f) {
2570776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION_3D;
2580776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2590776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION_3D;
2600776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
26452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotationY() const {
26552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotationY;
26652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
26752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setScaleX(float scaleX) {
2690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (scaleX != mScaleX) {
2700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mScaleX = scaleX;
2710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mScaleX == 1.0f && mScaleY == 1.0f) {
2730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~SCALE;
2740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= SCALE;
2760776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2770776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
28052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getScaleX() const {
28152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mScaleX;
28252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
28352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setScaleY(float scaleY) {
2850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (scaleY != mScaleY) {
2860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mScaleY = scaleY;
2870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mScaleX == 1.0f && mScaleY == 1.0f) {
2890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~SCALE;
2900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= SCALE;
2920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
29652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getScaleY() const {
29752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mScaleY;
29852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
29952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setPivotX(float pivotX) {
3010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotX = pivotX;
3020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mMatrixDirty = true;
3030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (mPivotX == 0.0f && mPivotY == 0.0f) {
3040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags &= ~PIVOT;
3050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
3060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags |= PIVOT;
3070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotExplicitlySet = true;
3090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
31152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    ANDROID_API float getPivotX();
31252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setPivotY(float pivotY) {
3140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotY = pivotY;
3150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mMatrixDirty = true;
3160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (mPivotX == 0.0f && mPivotY == 0.0f) {
3170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags &= ~PIVOT;
3180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
3190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags |= PIVOT;
3200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotExplicitlySet = true;
3220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
32452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    ANDROID_API float getPivotY();
32552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setCameraDistance(float distance) {
3270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (distance != mCameraDistance) {
3280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mCameraDistance = distance;
3290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
3300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (!mTransformCamera) {
3310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mTransformCamera = new Sk3DView();
3320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mTransformMatrix3D = new SkMatrix();
3330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTransformCamera->setCameraLocation(0, 0, distance);
3350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
33852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getCameraDistance() const {
33952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mCameraDistance;
34052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
34152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeft(int left) {
3430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft) {
3440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
3450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
3460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
35252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getLeft() const {
35352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mLeft;
35452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
35552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3560776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTop(int top) {
3570776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (top != mTop) {
3580776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
3590776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
3600776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
36652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTop() const {
36752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTop;
36852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
36952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRight(int right) {
3710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (right != mRight) {
3720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight = right;
3730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
3740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3760776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3770776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
38052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRight() const {
38152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRight;
38252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
38352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setBottom(int bottom) {
3850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (bottom != mBottom) {
3860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom = bottom;
3870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
3880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
39452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getBottom() const {
39552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mBottom;
39652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
39752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeftTop(int left, int top) {
3990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft || top != mTop) {
4000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
4010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
4020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
4030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
4040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
4110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
4120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
4130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
4140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight = right;
4150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom = bottom;
4160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
4170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
4180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
42452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    void offsetLeftRight(float offset) {
4250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (offset != 0) {
4260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft += offset;
4270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight += offset;
4280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
43452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    void offsetTopBottom(float offset) {
4350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (offset != 0) {
4360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop += offset;
4370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom += offset;
4380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setCaching(bool caching) {
4450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mCaching = caching;
4460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int getWidth() {
4490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mWidth;
4500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int getHeight() {
4530776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mHeight;
4540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4550776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4560776a6069365bdea83855db154fa2d37f9d1d808Chris Craikprivate:
457ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void outputViewProperties(const int level);
458ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
459ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    template <class T>
460ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    inline void setViewProperties(OpenGLRenderer& renderer, T& handler, const int level);
461ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
462ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    template <class T>
463ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    inline void iterate(OpenGLRenderer& renderer, T& handler, const int level);
464ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
4650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void init();
4660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void clearResources();
4680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void updateMatrix();
4700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    class TextContainer {
4720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    public:
4730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        size_t length() const {
4740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            return mByteLength;
4750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4760776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4770776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        const char* text() const {
4780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            return (const char*) mText;
4790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4800776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4810776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        size_t mByteLength;
4820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        const char* mText;
4830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    };
4840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkBitmap*> mBitmapResources;
4860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkBitmap*> mOwnedBitmapResources;
4870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkiaColorFilter*> mFilterResources;
488e3b0a0117a2ab4118f868a731b238fe8f2430276Romain Guy    Vector<Res_png_9patch*> mPatchResources;
4890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkPaint*> mPaints;
4910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkPath*> mPaths;
4920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SortedVector<SkPath*> mSourcePaths;
4930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkRegion*> mRegions;
4940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkMatrix*> mMatrices;
4950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkiaShader*> mShaders;
4960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<Layer*> mLayers;
4970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    sp<DisplayListData> mDisplayListData;
4990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    size_t mSize;
5010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mIsRenderable;
5030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    uint32_t mFunctorCount;
5040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    String8 mName;
5069846de68f1b4f2720da421e5242017c28cfc93edChris Craik    bool mDestroyed; // used for debugging crash, TODO: remove once invalid state crash fixed
5070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    // View properties
509dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase    bool mClipToBounds;
5100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mAlpha;
5110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mHasOverlappingRendering;
5120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mTranslationX, mTranslationY;
5130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mRotation, mRotationX, mRotationY;
5140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mScaleX, mScaleY;
5150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mPivotX, mPivotY;
5160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mCameraDistance;
5170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mLeft, mTop, mRight, mBottom;
5180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mWidth, mHeight;
5190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mPrevWidth, mPrevHeight;
5200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mPivotExplicitlySet;
5210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mMatrixDirty;
5220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mMatrixIsIdentity;
5230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    uint32_t mMatrixFlags;
5240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mTransformMatrix;
5250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Sk3DView* mTransformCamera;
5260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mTransformMatrix3D;
5270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mStaticMatrix;
5280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mAnimationMatrix;
5290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mCaching;
530ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
531ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    /**
532ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * State operations - needed to defer displayList property operations (for example, when setting
533ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * an alpha causes a SaveLayerAlpha to occur). These operations point into mDisplayListData's
534ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * allocation, or null if uninitialized.
535ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     *
5369846de68f1b4f2720da421e5242017c28cfc93edChris Craik     * These are initialized (via friend re-constructors) when a displayList is issued in either
5379846de68f1b4f2720da421e5242017c28cfc93edChris Craik     * replay or deferred mode. If replaying, the ops are not used until the next frame. If
5389846de68f1b4f2720da421e5242017c28cfc93edChris Craik     * deferring, the ops may be stored in the DeferredDisplayList to be played back a second time.
539ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     *
5409846de68f1b4f2720da421e5242017c28cfc93edChris Craik     * They should be used at most once per frame (one call to 'iterate') to avoid overwriting data
541ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     */
542ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ClipRectOp* mClipRectOp;
543ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SaveLayerOp* mSaveLayerOp;
544ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SaveOp* mSaveOp;
545ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    RestoreToCountOp* mRestoreToCountOp;
5460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // class DisplayList
5470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace uirenderer
5490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace android
5500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#endif // ANDROID_HWUI_OPENGL_RENDERER_H
552