RenderProperties.h revision b49f446c98096c4790a11d9b5bc83a4e585278c9
1acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/*
2acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Copyright (C) 2014 The Android Open Source Project
3acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck *
4acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Licensed under the Apache License, Version 2.0 (the "License");
5acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * you may not use this file except in compliance with the License.
6acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * You may obtain a copy of the License at
7acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck *
8acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck *      http://www.apache.org/licenses/LICENSE-2.0
9acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck *
10acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Unless required by applicable law or agreed to in writing, software
11acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * distributed under the License is distributed on an "AS IS" BASIS,
12acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * See the License for the specific language governing permissions and
14acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * limitations under the License.
15acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */
16b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#ifndef RENDERNODEPROPERTIES_H
17b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#define RENDERNODEPROPERTIES_H
18acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
19acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <stddef.h>
20acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <cutils/compiler.h>
21acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <androidfw/ResourceTypes.h>
22acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
23acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkCamera.h>
24acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkMatrix.h>
25b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
26b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h"
27b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Outline.h"
28acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
29acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#define TRANSLATION 0x0001
30acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#define ROTATION    0x0002
31acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#define ROTATION_3D 0x0004
32acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#define SCALE       0x0008
33acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#define PIVOT       0x0010
34acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
35acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkBitmap;
36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkPaint;
37acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkRegion;
38acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
39acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android {
40acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer {
41acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass Matrix4;
43acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderNode;
44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
45acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/*
46acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode
47acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */
48acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderProperties {
49acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic:
50acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    RenderProperties();
51acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    virtual ~RenderProperties();
52acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
53acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setClipToBounds(bool clipToBounds) {
54acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mClipToBounds = clipToBounds;
55acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
56acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
57acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectBackwards(bool shouldProject) {
58acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mProjectBackwards = shouldProject;
59acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
60acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
61acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectionReceiver(bool shouldRecieve) {
62acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mProjectionReceiver = shouldRecieve;
63acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
64acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
65acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool isProjectionReceiver() {
66acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mProjectionReceiver;
67acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
68acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
69acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setStaticMatrix(SkMatrix* matrix) {
70acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mStaticMatrix;
71acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mStaticMatrix = new SkMatrix(*matrix);
72acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
73acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
74acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Can return NULL
75acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* getStaticMatrix() {
76acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mStaticMatrix;
77acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
78acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
79acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setAnimationMatrix(SkMatrix* matrix) {
80acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mAnimationMatrix;
81acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (matrix) {
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = new SkMatrix(*matrix);
83acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
84acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = NULL;
85acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
88acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setAlpha(float alpha) {
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (alpha != mAlpha) {
91acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAlpha = alpha;
92acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
94acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
95acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getAlpha() const {
96acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mAlpha;
97acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
98acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setHasOverlappingRendering(bool hasOverlappingRendering) {
100acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mHasOverlappingRendering = hasOverlappingRendering;
101acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
102acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool hasOverlappingRendering() const {
104acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mHasOverlappingRendering;
105acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
106acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
107acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationX(float translationX) {
108acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (translationX != mTranslationX) {
109acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTranslationX = translationX;
110acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
111acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
112acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
113acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
114acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationX() const {
115acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mTranslationX;
116acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
117acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
118acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationY(float translationY) {
119acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (translationY != mTranslationY) {
120acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTranslationY = translationY;
121acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
122acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
123acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
124acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
125acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationY() const {
126acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mTranslationY;
127acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
129acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationZ(float translationZ) {
130acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (translationZ != mTranslationZ) {
131acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTranslationZ = translationZ;
132acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
133acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
134acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
136acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationZ() const {
137acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mTranslationZ;
138acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotation(float rotation) {
141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (rotation != mRotation) {
142acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRotation = rotation;
143acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
144acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mRotation == 0.0f) {
145acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags &= ~ROTATION;
146acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
147acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags |= ROTATION;
148acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
149acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
150acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
151acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
152acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotation() const {
153acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mRotation;
154acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
155acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
156acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationX(float rotationX) {
157acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (rotationX != mRotationX) {
158acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRotationX = rotationX;
159acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
160acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mRotationX == 0.0f && mRotationY == 0.0f) {
161acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags &= ~ROTATION_3D;
162acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
163acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags |= ROTATION_3D;
164acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
165acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
166acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
167acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
168acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationX() const {
169acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mRotationX;
170acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
171acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
172acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationY(float rotationY) {
173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (rotationY != mRotationY) {
174acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRotationY = rotationY;
175acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
176acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mRotationX == 0.0f && mRotationY == 0.0f) {
177acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags &= ~ROTATION_3D;
178acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
179acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags |= ROTATION_3D;
180acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
181acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
182acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
183acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationY() const {
185acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mRotationY;
186acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
187acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
188acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleX(float scaleX) {
189acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (scaleX != mScaleX) {
190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mScaleX = scaleX;
191acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
192acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mScaleX == 1.0f && mScaleY == 1.0f) {
193acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags &= ~SCALE;
194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags |= SCALE;
196acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
197acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
198acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
199acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleX() const {
201acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mScaleX;
202acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
203acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleY(float scaleY) {
205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (scaleY != mScaleY) {
206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mScaleY = scaleY;
207acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
208acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mScaleX == 1.0f && mScaleY == 1.0f) {
209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags &= ~SCALE;
210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
211acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixFlags |= SCALE;
212acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
213acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
214acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
217acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mScaleY;
218acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
220acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotX(float pivotX) {
221acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mPivotX = pivotX;
222acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mMatrixDirty = true;
223acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (mPivotX == 0.0f && mPivotY == 0.0f) {
224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags &= ~PIVOT;
225acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags |= PIVOT;
227acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
228acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mPivotExplicitlySet = true;
229acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
230acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
231acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    ANDROID_API float getPivotX();
232acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
233acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotY(float pivotY) {
234acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mPivotY = pivotY;
235acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mMatrixDirty = true;
236acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (mPivotX == 0.0f && mPivotY == 0.0f) {
237acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags &= ~PIVOT;
238acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
239acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags |= PIVOT;
240acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
241acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mPivotExplicitlySet = true;
242acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
243acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    ANDROID_API float getPivotY();
245acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
246acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCameraDistance(float distance) {
247acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (distance != mCameraDistance) {
248acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mCameraDistance = distance;
249acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixDirty = true;
250acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (!mTransformCamera) {
251acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformCamera = new Sk3DView();
252acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mTransformMatrix3D = new SkMatrix();
253acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
254acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTransformCamera->setCameraLocation(0, 0, distance);
255acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
256acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
257acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
258acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
259acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mCameraDistance;
260acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeft(int left) {
263acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (left != mLeft) {
264acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mLeft = left;
265acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mWidth = mRight - mLeft;
266acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
267acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
268acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
269acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
270acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
271acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
272acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mLeft;
274acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
275acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
276acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTop(int top) {
277acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (top != mTop) {
278acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTop = top;
279acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mHeight = mBottom - mTop;
280acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
281acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
282acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
283acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
284acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
285acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
286acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
287acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mTop;
288acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
289acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
290acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRight(int right) {
291acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (right != mRight) {
292acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRight = right;
293acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mWidth = mRight - mLeft;
294acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
295acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
296acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
297acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
298acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
299acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
300acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
301acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mRight;
302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
304acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setBottom(int bottom) {
305acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (bottom != mBottom) {
306acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mBottom = bottom;
307acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mHeight = mBottom - mTop;
308acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
309acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
310acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
311acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
312acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
313acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
315acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mBottom;
316acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
317acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTop(int left, int top) {
319acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (left != mLeft || top != mTop) {
320acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mLeft = left;
321acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTop = top;
322acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mWidth = mRight - mLeft;
323acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mHeight = mBottom - mTop;
324acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
325acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
329acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
331acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (left != mLeft || top != mTop || right != mRight || bottom != mBottom) {
332acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mLeft = left;
333acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTop = top;
334acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRight = right;
335acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mBottom = bottom;
336acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mWidth = mRight - mLeft;
337acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mHeight = mBottom - mTop;
338acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
339acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
341acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
342acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
343acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
344acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetLeftRight(float offset) {
345acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
346acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mLeft += offset;
347acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mRight += offset;
348acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
349acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
350acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
351acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
352acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
353acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
354acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetTopBottom(float offset) {
355acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
356acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mTop += offset;
357acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mBottom += offset;
358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            if (mMatrixFlags > TRANSLATION && !mPivotExplicitlySet) {
359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck                mMatrixDirty = true;
360acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
361acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
362acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
363acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
364acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCaching(bool caching) {
365acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mCaching = caching;
366acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
367acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
368b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
369acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mWidth;
370acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
371acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
372b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
373acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mHeight;
374acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
376b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    Outline& outline() {
377b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik        return mOutline;
378b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
379b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
380acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
381acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void onTranslationUpdate() {
382acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        mMatrixDirty = true;
383acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (mTranslationX == 0.0f && mTranslationY == 0.0f && mTranslationZ == 0.0f) {
384acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags &= ~TRANSLATION;
385acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
386acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mMatrixFlags |= TRANSLATION;
387acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
388acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
389acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
390acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void updateMatrix();
391acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
392acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
393b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    Outline mOutline;
394acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mClipToBounds;
395acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mProjectBackwards;
396acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mProjectionReceiver;
397acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mAlpha;
398acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mHasOverlappingRendering;
399acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mTranslationX, mTranslationY, mTranslationZ;
400acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mRotation, mRotationX, mRotationY;
401acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mScaleX, mScaleY;
402acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mPivotX, mPivotY;
403acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mCameraDistance;
404acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    int mLeft, mTop, mRight, mBottom;
405acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    int mWidth, mHeight;
406acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    int mPrevWidth, mPrevHeight;
407acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mPivotExplicitlySet;
408acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mMatrixDirty;
409acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mMatrixIsIdentity;
410acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
411acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    /**
412acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     * Stores the total transformation of the DisplayList based upon its scalar
413acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     * translate/rotate/scale properties.
414acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     *
415acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     * In the common translation-only case, the matrix isn't allocated and the mTranslation
416acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     * properties are used directly.
417acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck     */
418acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    Matrix4* mTransformMatrix;
419acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    uint32_t mMatrixFlags;
420acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    Sk3DView* mTransformCamera;
421acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mTransformMatrix3D;
422acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
423acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
424acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool mCaching;
425acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
426acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    friend class RenderNode;
427acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
428acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
429acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
430acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
431acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
432b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
433