RenderProperties.h revision e45b1fd03b524d2b57cc6c222d89076a31a08bea
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
43acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/*
44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode
45acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */
46acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderProperties {
47acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic:
48acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    RenderProperties();
49acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    virtual ~RenderProperties();
50acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
51d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties& operator=(const RenderProperties& other);
52d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
53acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setClipToBounds(bool clipToBounds) {
54d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mClipToBounds = clipToBounds;
55acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
56acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
57acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectBackwards(bool shouldProject) {
58d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectBackwards = shouldProject;
59acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
60acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
61acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectionReceiver(bool shouldRecieve) {
62d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectionReceiver = shouldRecieve;
63acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
64acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
65d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool isProjectionReceiver() const {
66d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectionReceiver;
67acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
68acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
69d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setStaticMatrix(const SkMatrix* matrix) {
70acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mStaticMatrix;
71d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (matrix) {
72d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = new SkMatrix(*matrix);
73d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        } else {
74d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = NULL;
75d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        }
76acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
77acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
78acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Can return NULL
79d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getStaticMatrix() const {
80acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mStaticMatrix;
81acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
83d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setAnimationMatrix(const SkMatrix* matrix) {
84acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mAnimationMatrix;
85acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (matrix) {
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = new SkMatrix(*matrix);
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
88acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = NULL;
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
91acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
92acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setAlpha(float alpha) {
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
94d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (alpha != mPrimitiveFields.mAlpha) {
95d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mAlpha = alpha;
96acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
97acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
98acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getAlpha() const {
100d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mAlpha;
101acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
102acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setHasOverlappingRendering(bool hasOverlappingRendering) {
104d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mHasOverlappingRendering = hasOverlappingRendering;
105acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
106acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
107acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool hasOverlappingRendering() const {
108d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
109acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
110acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
111cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    void setElevation(float elevation) {
112cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        if (elevation != mPrimitiveFields.mElevation) {
113cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik            mPrimitiveFields.mElevation = elevation;
114cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik            // mMatrixOrPivotDirty not set, since matrix doesn't respect Z
115cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        }
116cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
117cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
118cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    float getElevation() const {
119cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        return mPrimitiveFields.mElevation;
120cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
121cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
122acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationX(float translationX) {
123d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationX != mPrimitiveFields.mTranslationX) {
124d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationX = translationX;
125f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
126acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
127acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
129acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationX() const {
130d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationX;
131acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
132acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
133acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationY(float translationY) {
134d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationY != mPrimitiveFields.mTranslationY) {
135d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationY = translationY;
136f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
137acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
138acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationY() const {
141d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationY;
142acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
143acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
144acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationZ(float translationZ) {
145d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationZ != mPrimitiveFields.mTranslationZ) {
146d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationZ = translationZ;
147cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik            // mMatrixOrPivotDirty not set, since matrix doesn't respect Z
148acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
149acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
150acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
151acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationZ() const {
152d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationZ;
153acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
154acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
155e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
156e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void setX(float value) {
157e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        setTranslationX(value - getLeft());
158e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
159e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
160e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
161e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float getX() const {
162e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return getLeft() + getTranslationX();
163e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
164e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
165e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
166e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void setY(float value) {
167e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        setTranslationY(value - getTop());
168e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
169e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
170e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
171e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    float getY() const {
172e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        return getTop() + getTranslationY();
173e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
174e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
175e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    // Animation helper
176e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    void setZ(float value) {
177e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck        setTranslationZ(value - getElevation());
178e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    }
179e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
180cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    float getZ() const {
181cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        return getElevation() + getTranslationZ();
182cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik    }
183cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik
184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotation(float rotation) {
185d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotation != mPrimitiveFields.mRotation) {
186d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotation = rotation;
187f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
188acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
189acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
191acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotation() const {
192d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotation;
193acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationX(float rotationX) {
196d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationX != mPrimitiveFields.mRotationX) {
197d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationX = rotationX;
198f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
199acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
201acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
202acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationX() const {
203d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationX;
204acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
205acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
206acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationY(float rotationY) {
207d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationY != mPrimitiveFields.mRotationY) {
208d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationY = rotationY;
209f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
211acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
212acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
213acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationY() const {
214d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationY;
215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
216acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
217acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleX(float scaleX) {
218d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleX != mPrimitiveFields.mScaleX) {
219d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleX = scaleX;
220f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
221acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
222acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
223acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleX() const {
225d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleX;
226acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
227acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
228acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleY(float scaleY) {
229d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleY != mPrimitiveFields.mScaleY) {
230d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleY = scaleY;
231f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
232acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
233acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
234acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
235acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
236d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleY;
237acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
238acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
239acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotX(float pivotX) {
240d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotX = pivotX;
241f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        mPrimitiveFields.mMatrixOrPivotDirty = true;
242d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
243acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
245d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /* Note that getPivotX and getPivotY are adjusted by updateMatrix(),
246d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * so the value returned mPrimitiveFields.may be stale if the RenderProperties has been
247d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * mPrimitiveFields.modified since the last call to updateMatrix()
248d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
249d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotX() const {
250d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotX;
251d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
252acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
253acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotY(float pivotY) {
254d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotY = pivotY;
255f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        mPrimitiveFields.mMatrixOrPivotDirty = true;
256d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
257acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
258acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
259d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotY() const {
260d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotY;
261d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
26349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    bool isPivotExplicitlySet() const {
26449e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return mPrimitiveFields.mPivotExplicitlySet;
26549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
26649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
267acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCameraDistance(float distance) {
26849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        if (distance != getCameraDistance()) {
269f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
27049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik            mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance);
271acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
272acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
274acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
27549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        // TODO: update getCameraLocationZ() to be const
27649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ();
277acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
278acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
279acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeft(int left) {
280d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft) {
281d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
282d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
283f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
284f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
285acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
286acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
287acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
288acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
289acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
290d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mLeft;
291acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
292acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
293acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTop(int top) {
294d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (top != mPrimitiveFields.mTop) {
295d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
296d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
297f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
298f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
299acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
300acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
301acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
304d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTop;
305acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
306acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
307acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRight(int right) {
308d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (right != mPrimitiveFields.mRight) {
309d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
310d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
311f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
312f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
313acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
315acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
316acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
317acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
318d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRight;
319acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
320acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
321acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setBottom(int bottom) {
322d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (bottom != mPrimitiveFields.mBottom) {
323d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
324d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
325f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
326f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
329acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
330acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
331acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
332d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mBottom;
333acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
334acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
335acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTop(int left, int top) {
336d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop) {
337d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
338d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
339d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
340d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
341f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
342f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
343acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
344acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
345acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
346acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
347acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
348cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop
349cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik                || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) {
350d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
351d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
352d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
353d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
354d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
355d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
356f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
357f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
358acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
359acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
360acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
361acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
362acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetLeftRight(float offset) {
363acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
364d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft += offset;
365d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight += offset;
366f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
367f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
368acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
369acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
370acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
371acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
372acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetTopBottom(float offset) {
373acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
374d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop += offset;
375d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom += offset;
376f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
377f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
378acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
379acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
380acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
381acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
382acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCaching(bool caching) {
383d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mCaching = caching;
384acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
385acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
386b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
387d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mWidth;
388acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
389acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
390b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
391d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHeight;
392d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
393d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
394d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getAnimationMatrix() const {
395d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mAnimationMatrix;
396d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
397d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
398f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool hasTransformMatrix() const {
399f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix() && !getTransformMatrix()->isIdentity();
400f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    }
401f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck
402f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    // May only call this if hasTransformMatrix() is true
403f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool isTransformTranslateOnly() const {
404f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask;
405d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
406d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
40749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    const SkMatrix* getTransformMatrix() const {
408f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
409d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mComputedFields.mTransformMatrix;
410d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
411d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
412d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getCaching() const {
413d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mCaching;
414acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
415acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
416d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getClipToBounds() const {
417d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mClipToBounds;
418d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
419d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
420d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getHasOverlappingRendering() const {
421d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
422d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
424d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Outline& getOutline() const {
425d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
426d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
427d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
4288c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const RevealClip& getRevealClip() const {
4298c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
4308c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4318c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
432d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getProjectBackwards() const {
433d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectBackwards;
434d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
435d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
436d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void debugOutputProperties(const int level) const;
437d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
438d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    ANDROID_API void updateMatrix();
439d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
4408c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    ANDROID_API void updateClipPath();
4418c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4428c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    // signals that mComputedFields.mClipPath is up to date, and should be used for clipping
4438c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    bool hasClippingPath() const {
4448c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mOutline.willClip() || mPrimitiveFields.mRevealClip.willClip();
4458c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4468c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4478c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const SkPath* getClippingPath() const {
4488c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return hasClippingPath() ? mComputedFields.mClipPath : NULL;
4498c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4508c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4518c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    SkRegion::Op getClippingPathOp() const {
4528c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mComputedFields.mClipPathOp;
4538c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4548c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    Outline& mutableOutline() {
456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
457b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
458b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
4598c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    RevealClip& mutableRevealClip() {
4608c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
4618c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4628c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
463acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
464acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
465acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
466d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct PrimitiveFields {
467d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        PrimitiveFields();
468d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
469d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Outline mOutline;
4708c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        RevealClip mRevealClip;
471d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mClipToBounds;
472d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectBackwards;
473d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectionReceiver;
474d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mAlpha;
475d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mHasOverlappingRendering;
476cc39e16cb98855f35079941b5e7e6eac2b7bc388Chris Craik        float mElevation;
477d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mTranslationX, mTranslationY, mTranslationZ;
478d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mRotation, mRotationX, mRotationY;
479d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mScaleX, mScaleY;
480d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mPivotX, mPivotY;
481d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mLeft, mTop, mRight, mBottom;
482d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mWidth, mHeight;
483d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mPivotExplicitlySet;
484f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        bool mMatrixOrPivotDirty;
485d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mCaching;
486d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mPrimitiveFields;
487d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
488acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
489acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
490acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
491d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /**
492d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * These fields are all generated from other properties and are not set directly.
493d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
494d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct ComputedFields {
495d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ComputedFields();
496d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ~ComputedFields();
497d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
498d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        /**
499d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * Stores the total transformation of the DisplayList based upon its scalar
500d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * translate/rotate/scale properties.
501d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         *
50249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * In the common translation-only case, the matrix isn't necessarily allocated,
50349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * and the mTranslation properties are used directly.
504d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         */
50549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        SkMatrix* mTransformMatrix;
50649e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
50749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        Sk3DView mTransformCamera;
5088c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        SkPath* mClipPath; // TODO: remove this, create new ops for efficient/special case clipping
5098c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        SkRegion::Op mClipPathOp;
510d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mComputedFields;
511acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
512acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
513acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
514acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
515acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
516b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
517