RenderProperties.h revision d0a0b2a3140bfb1819a116413ce9d81886697a07
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
53d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties& operator=(const RenderProperties& other);
54d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
55acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setClipToBounds(bool clipToBounds) {
56d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mClipToBounds = clipToBounds;
57acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
58acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
59acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectBackwards(bool shouldProject) {
60d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectBackwards = shouldProject;
61acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
62acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
63acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectionReceiver(bool shouldRecieve) {
64d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectionReceiver = shouldRecieve;
65acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
66acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
67d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool isProjectionReceiver() const {
68d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectionReceiver;
69acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
70acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
71d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setStaticMatrix(const SkMatrix* matrix) {
72acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mStaticMatrix;
73d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (matrix) {
74d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = new SkMatrix(*matrix);
75d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        } else {
76d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = NULL;
77d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        }
78acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
79acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
80acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Can return NULL
81d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getStaticMatrix() const {
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mStaticMatrix;
83acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
84acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
85d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setAnimationMatrix(const SkMatrix* matrix) {
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mAnimationMatrix;
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (matrix) {
88acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = new SkMatrix(*matrix);
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = NULL;
91acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
92acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
94acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setAlpha(float alpha) {
95acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
96d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (alpha != mPrimitiveFields.mAlpha) {
97d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mAlpha = alpha;
98acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
100acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
101acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getAlpha() const {
102d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mAlpha;
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
104acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
105acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setHasOverlappingRendering(bool hasOverlappingRendering) {
106d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mHasOverlappingRendering = hasOverlappingRendering;
107acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
108acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
109acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool hasOverlappingRendering() const {
110d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
111acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
112acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
113acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationX(float translationX) {
114d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationX != mPrimitiveFields.mTranslationX) {
115d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationX = translationX;
116acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
117acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
118acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
119acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
120acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationX() const {
121d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationX;
122acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
123acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
124acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationY(float translationY) {
125d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationY != mPrimitiveFields.mTranslationY) {
126d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationY = translationY;
127acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
129acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
130acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
131acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationY() const {
132d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationY;
133acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
134acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationZ(float translationZ) {
136d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationZ != mPrimitiveFields.mTranslationZ) {
137d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationZ = translationZ;
138acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            onTranslationUpdate();
139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
142acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationZ() const {
143d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationZ;
144acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
145acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
146acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotation(float rotation) {
147d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotation != mPrimitiveFields.mRotation) {
148d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotation = rotation;
149d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
150d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mRotation == 0.0f) {
151d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags &= ~ROTATION;
152acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
153d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags |= ROTATION;
154acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
155acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
156acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
157acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
158acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotation() const {
159d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotation;
160acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
161acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
162acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationX(float rotationX) {
163d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationX != mPrimitiveFields.mRotationX) {
164d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationX = rotationX;
165d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
166d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mRotationX == 0.0f && mPrimitiveFields.mRotationY == 0.0f) {
167d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags &= ~ROTATION_3D;
168acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
169d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags |= ROTATION_3D;
170acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
171acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
172acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
174acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationX() const {
175d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationX;
176acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
177acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
178acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationY(float rotationY) {
179d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationY != mPrimitiveFields.mRotationY) {
180d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationY = rotationY;
181d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
182d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mRotationX == 0.0f && mPrimitiveFields.mRotationY == 0.0f) {
183d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags &= ~ROTATION_3D;
184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
185d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags |= ROTATION_3D;
186acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
187acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
188acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
189acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationY() const {
191d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationY;
192acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
193acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleX(float scaleX) {
195d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleX != mPrimitiveFields.mScaleX) {
196d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleX = scaleX;
197d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
198d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mScaleX == 1.0f && mPrimitiveFields.mScaleY == 1.0f) {
199d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags &= ~SCALE;
200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
201d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags |= SCALE;
202acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
203acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleX() const {
207d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleX;
208acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleY(float scaleY) {
211d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleY != mPrimitiveFields.mScaleY) {
212d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleY = scaleY;
213d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
214d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mScaleX == 1.0f && mPrimitiveFields.mScaleY == 1.0f) {
215d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags &= ~SCALE;
216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            } else {
217d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixFlags |= SCALE;
218acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
220acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
221acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
222acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
223d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleY;
224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
225acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotX(float pivotX) {
227d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotX = pivotX;
228d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mMatrixDirty = true;
229d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (mPrimitiveFields.mPivotX == 0.0f && mPrimitiveFields.mPivotY == 0.0f) {
230d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags &= ~PIVOT;
231acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
232d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags |= PIVOT;
233acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
234d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
235acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
236acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
237d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /* Note that getPivotX and getPivotY are adjusted by updateMatrix(),
238d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * so the value returned mPrimitiveFields.may be stale if the RenderProperties has been
239d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * mPrimitiveFields.modified since the last call to updateMatrix()
240d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
241d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotX() const {
242d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotX;
243d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
245acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotY(float pivotY) {
246d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotY = pivotY;
247d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mMatrixDirty = true;
248d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (mPrimitiveFields.mPivotX == 0.0f && mPrimitiveFields.mPivotY == 0.0f) {
249d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags &= ~PIVOT;
250acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
251d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags |= PIVOT;
252acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
253d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
254acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
255acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
256d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotY() const {
257d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotY;
258d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
259acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
260acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCameraDistance(float distance) {
261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (distance != mCameraDistance) {
262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mCameraDistance = distance;
263d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixDirty = true;
264d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (!mComputedFields.mTransformCamera) {
265d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mComputedFields.mTransformCamera = new Sk3DView();
266d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mComputedFields.mTransformMatrix3D = new SkMatrix();
267acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
268d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mComputedFields.mTransformCamera->setCameraLocation(0, 0, distance);
269acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
270acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
271acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
272acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mCameraDistance;
274acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
275acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
276acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeft(int left) {
277d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft) {
278d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
279d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
280d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
281d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
282acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
283acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
284acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
285acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
286acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
287d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mLeft;
288acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
289acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
290acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTop(int top) {
291d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (top != mPrimitiveFields.mTop) {
292d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
293d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
294d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
295d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
296acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
297acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
298acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
299acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
300acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
301d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTop;
302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
304acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRight(int right) {
305d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (right != mPrimitiveFields.mRight) {
306d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
307d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
308d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
309d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
310acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
311acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
312acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
313acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
315d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRight;
316acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
317acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setBottom(int bottom) {
319d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (bottom != mPrimitiveFields.mBottom) {
320d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
321d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
322d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
323d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
324acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
325acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
329d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mBottom;
330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
331acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
332acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTop(int left, int top) {
333d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop) {
334d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
335d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
336d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
337d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
338d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
339d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
341acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
342acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
343acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
344acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
345d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) {
346d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
347d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
348d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
349d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
350d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
351d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
352d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
353d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
354acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
355acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
356acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
357acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetLeftRight(float offset) {
359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
360d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft += offset;
361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight += offset;
362d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
363d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
364acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
365acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
366acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
367acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
368acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetTopBottom(float offset) {
369acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
370d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop += offset;
371d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom += offset;
372d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            if (mPrimitiveFields.mMatrixFlags > TRANSLATION && !mPrimitiveFields.mPivotExplicitlySet) {
373d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck                mPrimitiveFields.mMatrixDirty = true;
374acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
376acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
377acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
378acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCaching(bool caching) {
379d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mCaching = caching;
380acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
381acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
382b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
383d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mWidth;
384acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
385acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
386b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
387d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHeight;
388d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
389d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
390d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getAnimationMatrix() const {
391d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mAnimationMatrix;
392d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
393d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
394d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    uint32_t getMatrixFlags() const {
395d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mMatrixFlags;
396d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
397d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
398d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Matrix4* getTransformMatrix() const {
399d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mComputedFields.mTransformMatrix;
400d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
401d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
402d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getCaching() const {
403d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mCaching;
404acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
405acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
406d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getClipToBounds() const {
407d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mClipToBounds;
408d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
409d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
410d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getHasOverlappingRendering() const {
411d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
412d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
413d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
414d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Outline& getOutline() const {
415d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
416d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
417d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
418d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getProjectBackwards() const {
419d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectBackwards;
420d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
421d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
422d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void debugOutputProperties(const int level) const;
423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
424d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    ANDROID_API void updateMatrix();
425d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
426d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    Outline& mutableOutline() {
427d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
428b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
429b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
430acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
431acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void onTranslationUpdate() {
432d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mMatrixDirty = true;
433d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (mPrimitiveFields.mTranslationX == 0.0f && mPrimitiveFields.mTranslationY == 0.0f && mPrimitiveFields.mTranslationZ == 0.0f) {
434d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags &= ~TRANSLATION;
435acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
436d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mMatrixFlags |= TRANSLATION;
437acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
438acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
439acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
440acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
441d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct PrimitiveFields {
442d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        PrimitiveFields();
443d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
444d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Outline mOutline;
445d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mClipToBounds;
446d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectBackwards;
447d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectionReceiver;
448d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mAlpha;
449d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mHasOverlappingRendering;
450d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mTranslationX, mTranslationY, mTranslationZ;
451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mRotation, mRotationX, mRotationY;
452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mScaleX, mScaleY;
453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mPivotX, mPivotY;
454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mLeft, mTop, mRight, mBottom;
455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mWidth, mHeight;
456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mPrevWidth, mPrevHeight;
457d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mPivotExplicitlySet;
458d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mMatrixDirty;
459d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mMatrixIsIdentity;
460d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        uint32_t mMatrixFlags;
461d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mCaching;
462d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mPrimitiveFields;
463d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
464d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    // mCameraDistance isn't in mPrimitiveFields as it has a complex setter
465acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float mCameraDistance;
466acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
467acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
468acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
469d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /**
470d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * These fields are all generated from other properties and are not set directly.
471d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
472d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct ComputedFields {
473d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ComputedFields();
474d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ~ComputedFields();
475d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
476d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        /**
477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * Stores the total transformation of the DisplayList based upon its scalar
478d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * translate/rotate/scale properties.
479d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         *
480d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * In the common translation-only case, the matrix isn't allocated and the mTranslation
481d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * properties are used directly.
482d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         */
483d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Matrix4* mTransformMatrix;
484d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Sk3DView* mTransformCamera;
485d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        SkMatrix* mTransformMatrix3D;
486d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mComputedFields;
487acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
488acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
489acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
490acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
491acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
492b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
493