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
290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/RefBase.h>
300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/SortedVector.h>
310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/String8.h>
320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <utils/Vector.h>
330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include <cutils/compiler.h>
340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "utils/LinearAllocator.h"
360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#include "Debug.h"
380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define TRANSLATION 0x0001
400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define ROTATION    0x0002
410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define ROTATION_3D 0x0004
420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define SCALE       0x0008
430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#define PIVOT       0x0010
440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
450776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkBitmap;
460776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkPaint;
470776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkPath;
480776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkRegion;
490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
500776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace android {
510776a6069365bdea83855db154fa2d37f9d1d808Chris Craiknamespace uirenderer {
520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikclass DeferredDisplayList;
540776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayListOp;
550776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayListRenderer;
560776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass OpenGLRenderer;
570776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass Rect;
580776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass Layer;
590776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkiaColorFilter;
600776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass SkiaShader;
610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
62ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass ClipRectOp;
63ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveLayerOp;
64ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass SaveOp;
65ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass RestoreToCountOp;
66ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
67ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstruct DeferStateStruct {
68ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    DeferStateStruct(DeferredDisplayList& deferredList, OpenGLRenderer& renderer, int replayFlags)
69ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            : mDeferredList(deferredList), mRenderer(renderer), mReplayFlags(replayFlags) {}
70ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    DeferredDisplayList& mDeferredList;
71ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    OpenGLRenderer& mRenderer;
72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    const int mReplayFlags;
73ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik};
74ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
75ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstruct ReplayStateStruct {
76ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ReplayStateStruct(OpenGLRenderer& renderer, Rect& dirty, int replayFlags)
77ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            : mRenderer(renderer), mDirty(dirty), mReplayFlags(replayFlags),
78ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            mDrawGlStatus(DrawGlInfo::kStatusDone) {}
79ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    OpenGLRenderer& mRenderer;
80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    Rect& mDirty;
81ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    const int mReplayFlags;
82ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    status_t mDrawGlStatus;
83ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik};
84ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/**
860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Refcounted structure that holds data used in display list stream
870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */
88ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikclass DisplayListData : public LightRefBase<DisplayListData> {
890776a6069365bdea83855db154fa2d37f9d1d808Chris Craikpublic:
900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    LinearAllocator allocator;
910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<DisplayListOp*> displayListOps;
920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik};
930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik/**
950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik * Replays recorded drawing commands.
960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik */
970776a6069365bdea83855db154fa2d37f9d1d808Chris Craikclass DisplayList {
980776a6069365bdea83855db154fa2d37f9d1d808Chris Craikpublic:
990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    DisplayList(const DisplayListRenderer& recorder);
1000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API ~DisplayList();
1010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    // See flags defined in DisplayList.java
1030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    enum ReplayFlag {
1040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        kReplayFlag_ClipChildren = 0x1
1050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    };
1060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API size_t getSize();
1090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
1100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API static void outputLogBuffer(int fd);
1110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);
1130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
114ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
115ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void defer(DeferStateStruct& deferStruct, const int level);
116ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void replay(ReplayStateStruct& replayStruct, const int level);
1170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void output(uint32_t level = 0);
1190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    ANDROID_API void reset();
1210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRenderable(bool renderable) {
1230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mIsRenderable = renderable;
1240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool isRenderable() const {
1270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mIsRenderable;
1280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setName(const char* name) {
1310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (name) {
1320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mName.setTo(name);
1330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
13652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    const char* getName() const {
13752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mName.string();
13852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
13952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
140dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase    void setClipToBounds(bool clipToBounds) {
141dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase        mClipToBounds = clipToBounds;
1420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setStaticMatrix(SkMatrix* matrix) {
1450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        delete mStaticMatrix;
1460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mStaticMatrix = new SkMatrix(*matrix);
1470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
14952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    // Can return NULL
15052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    SkMatrix* getStaticMatrix() {
15152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mStaticMatrix;
15252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
15352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setAnimationMatrix(SkMatrix* matrix) {
1550776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        delete mAnimationMatrix;
1560776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (matrix) {
1570776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAnimationMatrix = new SkMatrix(*matrix);
1580776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
1590776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAnimationMatrix = NULL;
1600776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
1630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setAlpha(float alpha) {
1640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
1650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (alpha != mAlpha) {
1660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mAlpha = alpha;
1670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
17052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getAlpha() const {
17152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mAlpha;
17252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
17352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setHasOverlappingRendering(bool hasOverlappingRendering) {
1750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mHasOverlappingRendering = hasOverlappingRendering;
1760776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1770776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
17852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    bool hasOverlappingRendering() const {
17952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mHasOverlappingRendering;
18052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
18152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTranslationX(float translationX) {
1830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (translationX != mTranslationX) {
1840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTranslationX = translationX;
1850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
1860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
1870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~TRANSLATION;
1880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
1890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= TRANSLATION;
1900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
1910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
1920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
1930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
19452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTranslationX() const {
19552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTranslationX;
19652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
19752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTranslationY(float translationY) {
1990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (translationY != mTranslationY) {
2000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTranslationY = translationY;
2010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
2030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~TRANSLATION;
2040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= TRANSLATION;
2060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
21052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTranslationY() const {
21152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTranslationY;
21252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
21352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotation(float rotation) {
2150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotation != mRotation) {
2160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotation = rotation;
2170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotation == 0.0f) {
2190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION;
2200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION;
2220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
22652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotation() const {
22752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotation;
22852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
22952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotationX(float rotationX) {
2310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotationX != mRotationX) {
2320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotationX = rotationX;
2330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotationX == 0.0f && mRotationY == 0.0f) {
2350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION_3D;
2360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION_3D;
2380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
24252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotationX() const {
24352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotationX;
24452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
24552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRotationY(float rotationY) {
2470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (rotationY != mRotationY) {
2480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRotationY = rotationY;
2490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mRotationX == 0.0f && mRotationY == 0.0f) {
2510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~ROTATION_3D;
2520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2530776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= ROTATION_3D;
2540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2550776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2560776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2570776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
25852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRotationY() const {
25952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRotationY;
26052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
26152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setScaleX(float scaleX) {
2630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (scaleX != mScaleX) {
2640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mScaleX = scaleX;
2650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mScaleX == 1.0f && mScaleY == 1.0f) {
2670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~SCALE;
2680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= SCALE;
2700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
27452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getScaleX() const {
27552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mScaleX;
27652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
27752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setScaleY(float scaleY) {
2790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (scaleY != mScaleY) {
2800776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mScaleY = scaleY;
2810776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
2820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mScaleX == 1.0f && mScaleY == 1.0f) {
2830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags &= ~SCALE;
2840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            } else {
2850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixFlags |= SCALE;
2860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
2870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
2880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
2890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
29052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getScaleY() const {
29152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mScaleY;
29252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
29352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
2940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setPivotX(float pivotX) {
2950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotX = pivotX;
2960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mMatrixDirty = true;
2970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (mPivotX == 0.0f && mPivotY == 0.0f) {
2980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags &= ~PIVOT;
2990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
3000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags |= PIVOT;
3010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotExplicitlySet = true;
3030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
30552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    ANDROID_API float getPivotX();
30652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setPivotY(float pivotY) {
3080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotY = pivotY;
3090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mMatrixDirty = true;
3100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (mPivotX == 0.0f && mPivotY == 0.0f) {
3110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags &= ~PIVOT;
3120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        } else {
3130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixFlags |= PIVOT;
3140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mPivotExplicitlySet = true;
3160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
31852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    ANDROID_API float getPivotY();
31952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setCameraDistance(float distance) {
3210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (distance != mCameraDistance) {
3220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mCameraDistance = distance;
3230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mMatrixDirty = true;
3240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (!mTransformCamera) {
3250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mTransformCamera = new Sk3DView();
3260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mTransformMatrix3D = new SkMatrix();
3270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3280776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTransformCamera->setCameraLocation(0, 0, distance);
3290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
33252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getCameraDistance() const {
33352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mCameraDistance;
33452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
33552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeft(int left) {
3370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft) {
3380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
3390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
3400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
34652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getLeft() const {
34752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mLeft;
34852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
34952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3500776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setTop(int top) {
3510776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (top != mTop) {
3520776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
3530776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
3540776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3550776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3560776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3570776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3580776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3590776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
36052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getTop() const {
36152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mTop;
36252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
36352036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setRight(int right) {
3650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (right != mRight) {
3660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight = right;
3670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
3680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
37452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getRight() const {
37552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mRight;
37652036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
37752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setBottom(int bottom) {
3790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (bottom != mBottom) {
3800776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom = bottom;
3810776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
3820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
3840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
3850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
3860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
3870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
38852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    float getBottom() const {
38952036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        return mBottom;
39052036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
39152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
3920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeftTop(int left, int top) {
3930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft || top != mTop) {
3940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
3950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
3960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
3970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
3980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
3990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4010776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
4050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
4060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft = left;
4070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop = top;
4080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight = right;
4090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom = bottom;
4100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mWidth = mRight - mLeft;
4110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mHeight = mBottom - mTop;
4120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
41852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    void offsetLeftRight(float offset) {
4190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (offset != 0) {
4200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mLeft += offset;
4210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mRight += offset;
4220776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4230776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4240776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4250776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4260776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4270776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
42852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    void offsetTopBottom(float offset) {
4290776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        if (offset != 0) {
4300776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mTop += offset;
4310776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            mBottom += offset;
4320776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
4330776a6069365bdea83855db154fa2d37f9d1d808Chris Craik                mMatrixDirty = true;
4340776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            }
4350776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4360776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4370776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void setCaching(bool caching) {
4390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        mCaching = caching;
4400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int getWidth() {
4430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mWidth;
4440776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4450776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4460776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int getHeight() {
4470776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        return mHeight;
4480776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    }
4490776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4500776a6069365bdea83855db154fa2d37f9d1d808Chris Craikprivate:
451ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    void outputViewProperties(const int level);
452ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
453ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    template <class T>
454ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    inline void setViewProperties(OpenGLRenderer& renderer, T& handler, const int level);
455ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
456ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    template <class T>
457ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    inline void iterate(OpenGLRenderer& renderer, T& handler, const int level);
458ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
4590776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void init();
4600776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4610776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void clearResources();
4620776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4630776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    void updateMatrix();
4640776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4650776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    class TextContainer {
4660776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    public:
4670776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        size_t length() const {
4680776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            return mByteLength;
4690776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4700776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4710776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        const char* text() const {
4720776a6069365bdea83855db154fa2d37f9d1d808Chris Craik            return (const char*) mText;
4730776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        }
4740776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4750776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        size_t mByteLength;
4760776a6069365bdea83855db154fa2d37f9d1d808Chris Craik        const char* mText;
4770776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    };
4780776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4790776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkBitmap*> mBitmapResources;
4800776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkBitmap*> mOwnedBitmapResources;
4810776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkiaColorFilter*> mFilterResources;
4820776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4830776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkPaint*> mPaints;
4840776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkPath*> mPaths;
4850776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SortedVector<SkPath*> mSourcePaths;
4860776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkRegion*> mRegions;
4870776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkMatrix*> mMatrices;
4880776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<SkiaShader*> mShaders;
4890776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Vector<Layer*> mLayers;
4900776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4910776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    sp<DisplayListData> mDisplayListData;
4920776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4930776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    size_t mSize;
4940776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4950776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mIsRenderable;
4960776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    uint32_t mFunctorCount;
4970776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
4980776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    String8 mName;
4990776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5000776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    // View properties
501dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase    bool mClipToBounds;
5020776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mAlpha;
5030776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mHasOverlappingRendering;
5040776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mTranslationX, mTranslationY;
5050776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mRotation, mRotationX, mRotationY;
5060776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mScaleX, mScaleY;
5070776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mPivotX, mPivotY;
5080776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    float mCameraDistance;
5090776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mLeft, mTop, mRight, mBottom;
5100776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mWidth, mHeight;
5110776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    int mPrevWidth, mPrevHeight;
5120776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mPivotExplicitlySet;
5130776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mMatrixDirty;
5140776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mMatrixIsIdentity;
5150776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    uint32_t mMatrixFlags;
5160776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mTransformMatrix;
5170776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    Sk3DView* mTransformCamera;
5180776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mTransformMatrix3D;
5190776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mStaticMatrix;
5200776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    SkMatrix* mAnimationMatrix;
5210776a6069365bdea83855db154fa2d37f9d1d808Chris Craik    bool mCaching;
522ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
523ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    /**
524ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * State operations - needed to defer displayList property operations (for example, when setting
525ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * an alpha causes a SaveLayerAlpha to occur). These operations point into mDisplayListData's
526ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * allocation, or null if uninitialized.
527ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     *
528ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * These are initialized (via friend constructors) when a displayList is issued in either replay
529ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * or deferred mode. If replaying, the ops are not used until the next frame. If deferring, the
530ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * ops may be stored in the DeferredDisplayList to be played back a second time.
531ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     *
532ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     * They should be used at most once per frame (one call to iterate)
533ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik     */
534ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    ClipRectOp* mClipRectOp;
535ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SaveLayerOp* mSaveLayerOp;
536ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SaveOp* mSaveOp;
537ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    RestoreToCountOp* mRestoreToCountOp;
5380776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // class DisplayList
5390776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5400776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace uirenderer
5410776a6069365bdea83855db154fa2d37f9d1d808Chris Craik}; // namespace android
5420776a6069365bdea83855db154fa2d37f9d1d808Chris Craik
5430776a6069365bdea83855db154fa2d37f9d1d808Chris Craik#endif // ANDROID_HWUI_OPENGL_RENDERER_H
544