RenderProperties.h revision 79c7de77a7da9cbcb9428ab6203987feb35a427f
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
19e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <algorithm>
20acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <stddef.h>
21e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include <vector>
22acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <cutils/compiler.h>
23acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <androidfw/ResourceTypes.h>
24acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
25acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkCamera.h>
26acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck#include <SkMatrix.h>
278c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include <SkRegion.h>
28b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#include "Animator.h"
30b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h"
318c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include "RevealClip.h"
32b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Outline.h"
33acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
34acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkBitmap;
35acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkPaint;
36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
37acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android {
38acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer {
39acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
40acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass Matrix4;
41acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderNode;
42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
4379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck// The __VA_ARGS__ will be executed if a & b are not equal
4479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET(a, b, ...) (a != b ? (a = b, ##__VA_ARGS__, true) : false)
4579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck#define RP_SET_AND_DIRTY(a, b) RP_SET(a, b, mPrimitiveFields.mMatrixOrPivotDirty = true)
4679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck
47acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/*
48acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode
49acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */
50acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderProperties {
51acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic:
52acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    RenderProperties();
53acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    virtual ~RenderProperties();
54acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
55d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties& operator=(const RenderProperties& other);
56d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
5779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setClipToBounds(bool clipToBounds) {
5879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mClipToBounds, clipToBounds);
59acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
60acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
6179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setProjectBackwards(bool shouldProject) {
6279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mProjectBackwards, shouldProject);
63acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
64acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
6579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setProjectionReceiver(bool shouldRecieve) {
6679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mProjectionReceiver, shouldRecieve);
67acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
68acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
69d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool isProjectionReceiver() const {
70d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectionReceiver;
71acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
72acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
7379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setStaticMatrix(const SkMatrix* matrix) {
74acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mStaticMatrix;
75d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (matrix) {
76d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = new SkMatrix(*matrix);
77d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        } else {
78d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = NULL;
79d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        }
8079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return true;
81acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
83acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Can return NULL
84d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getStaticMatrix() const {
85acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mStaticMatrix;
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
8879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setAnimationMatrix(const SkMatrix* matrix) {
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mAnimationMatrix;
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (matrix) {
91acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = new SkMatrix(*matrix);
92acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = NULL;
94acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
9579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return true;
96acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
97acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
9879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setAlpha(float alpha) {
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
10079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mAlpha, alpha);
101acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
102acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getAlpha() const {
104d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mAlpha;
105acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
106acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
10779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setHasOverlappingRendering(bool hasOverlappingRendering) {
10879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mHasOverlappingRendering, hasOverlappingRendering);
109acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
110acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
111acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool hasOverlappingRendering() const {
112d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
113acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
114acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
11579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setElevation(float elevation) {
11679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mElevation, elevation);
11779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        // Don't dirty matrix/pivot, since they don't respect Z
118cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
119cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
120cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    float getElevation() const {
121cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        return mPrimitiveFields.mElevation;
122cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
123cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
12479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setTranslationX(float translationX) {
12579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationX, translationX);
126acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
127acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationX() const {
129d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationX;
130acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
131acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
13279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setTranslationY(float translationY) {
13379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mTranslationY, translationY);
134acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
136acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationY() const {
137d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationY;
138acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
14079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setTranslationZ(float translationZ) {
14179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mTranslationZ, translationZ);
14279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        // mMatrixOrPivotDirty not set, since matrix doesn't respect Z
143acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
144acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
145acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationZ() const {
146d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationZ;
147acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
148acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
149e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
15079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setX(float value) {
15179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return setTranslationX(value - getLeft());
152e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
153e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
154e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float getX() const {
156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return getLeft() + getTranslationX();
157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
16079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setY(float value) {
16179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return setTranslationY(value - getTop());
162e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
164e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
165e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float getY() const {
166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return getTop() + getTranslationY();
167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
168e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
17079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setZ(float value) {
17179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return setTranslationZ(value - getElevation());
172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
174cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    float getZ() const {
175cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        return getElevation() + getTranslationZ();
176cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
177cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
17879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setRotation(float rotation) {
17979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mRotation, rotation);
180acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
181acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
182acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotation() const {
183d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotation;
184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
185acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
18679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setRotationX(float rotationX) {
18779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationX, rotationX);
188acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
189acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationX() const {
191d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationX;
192acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
193acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
19479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setRotationY(float rotationY) {
19579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mRotationY, rotationY);
196acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
197acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
198acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationY() const {
199d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationY;
200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
201acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
20279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setScaleX(float scaleX) {
20379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleX, scaleX);
204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleX() const {
207d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleX;
208acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
21079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setScaleY(float scaleY) {
21179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET_AND_DIRTY(mPrimitiveFields.mScaleY, scaleY);
212acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
213acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
214acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
215d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleY;
216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
217acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
21879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setPivotX(float pivotX) {
21979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mPivotX, pivotX)
22079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck                || !mPrimitiveFields.mPivotExplicitlySet) {
22179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
22279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mPivotExplicitlySet = true;
22379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
22479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        }
22579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
227acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
228d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /* Note that getPivotX and getPivotY are adjusted by updateMatrix(),
22979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck     * so the value returned may be stale if the RenderProperties has been
23079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck     * modified since the last call to updateMatrix()
231d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
232d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotX() const {
233d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotX;
234d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
235acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
23679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setPivotY(float pivotY) {
23779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mPivotY, pivotY)
23879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck                || !mPrimitiveFields.mPivotExplicitlySet) {
23979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
24079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            mPrimitiveFields.mPivotExplicitlySet = true;
24179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
24279c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        }
24379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
245acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
246d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotY() const {
247d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotY;
248d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
249acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
25049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    bool isPivotExplicitlySet() const {
25149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return mPrimitiveFields.mPivotExplicitlySet;
25249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
25349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
25479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setCameraDistance(float distance) {
25549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        if (distance != getCameraDistance()) {
256f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
25749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik            mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance);
25879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
259acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
26079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
261acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
263acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
26449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        // TODO: update getCameraLocationZ() to be const
26549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ();
266acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
267acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
26879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeft(int left) {
26979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mLeft, left)) {
270d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
271f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
272f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
27479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
275acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
27679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
277acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
278acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
279acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
280d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mLeft;
281acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
282acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
28379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setTop(int top) {
28479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mTop, top)) {
285d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
286f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
287f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
288acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
28979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
290acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
29179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
292acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
293acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
294acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
295d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTop;
296acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
297acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
29879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setRight(int right) {
29979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mRight, right)) {
300d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
301f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
302f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
30479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
305acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
30679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
307acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
308acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
309acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
310d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRight;
311acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
312acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
31379c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setBottom(int bottom) {
31479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        if (RP_SET(mPrimitiveFields.mBottom, bottom)) {
315d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
316f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
317f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
31979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
320acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
32179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
322acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
323acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
324acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
325d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mBottom;
326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
32879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeftTop(int left, int top) {
32979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        bool leftResult = setLeft(left);
33079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        bool topResult = setTop(top);
33179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return leftResult || topResult;
332acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
333acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
33479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setLeftTopRightBottom(int left, int top, int right, int bottom) {
335cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop
336cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik                || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) {
337d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
338d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
339d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
340d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
341d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
342d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
343f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
344f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
345acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
34679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
347acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
34879c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
349acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
350acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
35179c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool offsetLeftRight(float offset) {
352acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
353d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft += offset;
354d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight += offset;
35579c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
356acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
35779c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
36079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool offsetTopBottom(float offset) {
361acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
362d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop += offset;
363d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom += offset;
36479c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck            return true;
365acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
36679c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return false;
367acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
368acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
36979c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck    bool setCaching(bool caching) {
37079c7de77a7da9cbcb9428ab6203987feb35a427fJohn Reck        return RP_SET(mPrimitiveFields.mCaching, caching);
371acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
372acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
373b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
374d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mWidth;
375acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
376acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
377b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
378d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHeight;
379d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
380d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
381d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getAnimationMatrix() const {
382d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mAnimationMatrix;
383d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
384d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
385f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool hasTransformMatrix() const {
386f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix() && !getTransformMatrix()->isIdentity();
387f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    }
388f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck
389f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    // May only call this if hasTransformMatrix() is true
390f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool isTransformTranslateOnly() const {
391f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask;
392d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
393d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
39449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    const SkMatrix* getTransformMatrix() const {
395f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
396d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mComputedFields.mTransformMatrix;
397d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
398d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
399d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getCaching() const {
400d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mCaching;
401acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
402acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
403d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getClipToBounds() const {
404d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mClipToBounds;
405d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
406d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
407d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getHasOverlappingRendering() const {
408d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
409d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
410d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
411d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Outline& getOutline() const {
412d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
413d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
414d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
4158c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const RevealClip& getRevealClip() const {
4168c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
4178c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4188c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
419d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getProjectBackwards() const {
420d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectBackwards;
421d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
422d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void debugOutputProperties(const int level) const;
424d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
425d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    ANDROID_API void updateMatrix();
426d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
4278c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    bool hasClippingPath() const {
4282bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.willClip();
4298c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4308c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4318c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const SkPath* getClippingPath() const {
4322bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.getPath();
4338c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4348c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4358c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    SkRegion::Op getClippingPathOp() const {
4362bcad176757386d906157bb898167fbcebe9f55eChris Craik        return mPrimitiveFields.mRevealClip.isInverseClip()
4372bcad176757386d906157bb898167fbcebe9f55eChris Craik                ? SkRegion::kDifference_Op : SkRegion::kIntersect_Op;
4388c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4398c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
440d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    Outline& mutableOutline() {
441d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
442b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
443b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
4448c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    RevealClip& mutableRevealClip() {
4458c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
4468c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4478c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
448acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
449acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
450acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct PrimitiveFields {
452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        PrimitiveFields();
453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Outline mOutline;
4558c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        RevealClip mRevealClip;
456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mClipToBounds;
457d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectBackwards;
458d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectionReceiver;
459d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mAlpha;
460d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mHasOverlappingRendering;
461cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        float mElevation;
462d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mTranslationX, mTranslationY, mTranslationZ;
463d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mRotation, mRotationX, mRotationY;
464d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mScaleX, mScaleY;
465d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mPivotX, mPivotY;
466d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mLeft, mTop, mRight, mBottom;
467d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mWidth, mHeight;
468d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mPivotExplicitlySet;
469f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        bool mMatrixOrPivotDirty;
470d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mCaching;
471d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mPrimitiveFields;
472d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
473acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
474acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
475acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
476d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /**
477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * These fields are all generated from other properties and are not set directly.
478d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
479d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct ComputedFields {
480d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ComputedFields();
481d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ~ComputedFields();
482d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
483d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        /**
484d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * Stores the total transformation of the DisplayList based upon its scalar
485d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * translate/rotate/scale properties.
486d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         *
48749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * In the common translation-only case, the matrix isn't necessarily allocated,
48849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * and the mTranslation properties are used directly.
489d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         */
49049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        SkMatrix* mTransformMatrix;
49149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
49249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        Sk3DView mTransformCamera;
493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mComputedFields;
494acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
495acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
496acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
497acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
498acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
499b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
500