RenderProperties.h revision f7483e3af0513a1baa8341d403df2e0c0896a9ff
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>
258c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include <SkRegion.h>
26b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
27b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Rect.h"
288c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik#include "RevealClip.h"
29b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#include "Outline.h"
30acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
31acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkBitmap;
32acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass SkPaint;
33acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
34acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace android {
35acb6f07623b7df3d4179f70ae03ade574616ffa6John Recknamespace uirenderer {
36acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
37acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass Matrix4;
38acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderNode;
39acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
40acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck/*
41acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck * Data structure that holds the properties for a RenderNode
42acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck */
43acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckclass RenderProperties {
44acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckpublic:
45acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    RenderProperties();
46acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    virtual ~RenderProperties();
47acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
48d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    RenderProperties& operator=(const RenderProperties& other);
49d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
50acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setClipToBounds(bool clipToBounds) {
51d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mClipToBounds = clipToBounds;
52acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
53acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
54acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectBackwards(bool shouldProject) {
55d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectBackwards = shouldProject;
56acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
57acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
58acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setProjectionReceiver(bool shouldRecieve) {
59d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mProjectionReceiver = shouldRecieve;
60acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
61acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
62d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool isProjectionReceiver() const {
63d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectionReceiver;
64acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
65acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
66d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setStaticMatrix(const SkMatrix* matrix) {
67acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mStaticMatrix;
68d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (matrix) {
69d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = new SkMatrix(*matrix);
70d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        } else {
71d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mStaticMatrix = NULL;
72d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        }
73acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
74acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
75acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Can return NULL
76d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getStaticMatrix() const {
77acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        return mStaticMatrix;
78acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
79acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
80d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void setAnimationMatrix(const SkMatrix* matrix) {
81acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        delete mAnimationMatrix;
82acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (matrix) {
83acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = new SkMatrix(*matrix);
84acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        } else {
85acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            mAnimationMatrix = NULL;
86acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
87acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
88acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
89acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setAlpha(float alpha) {
90acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        alpha = fminf(1.0f, fmaxf(0.0f, alpha));
91d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (alpha != mPrimitiveFields.mAlpha) {
92d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mAlpha = alpha;
93acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
94acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
95acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
96acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getAlpha() const {
97d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mAlpha;
98acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
99acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
100acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setHasOverlappingRendering(bool hasOverlappingRendering) {
101d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mHasOverlappingRendering = hasOverlappingRendering;
102acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
103acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
104acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    bool hasOverlappingRendering() const {
105d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
106acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
107acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
108acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationX(float translationX) {
109d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationX != mPrimitiveFields.mTranslationX) {
110d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationX = translationX;
111f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
112acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
113acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
114acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
115acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationX() const {
116d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationX;
117acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
118acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
119acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationY(float translationY) {
120d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationY != mPrimitiveFields.mTranslationY) {
121d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationY = translationY;
122f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
123acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
124acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
125acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
126acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationY() const {
127d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationY;
128acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
129acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
130acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTranslationZ(float translationZ) {
131d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (translationZ != mPrimitiveFields.mTranslationZ) {
132d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTranslationZ = translationZ;
133f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
134acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
135acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
136acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
137acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTranslationZ() const {
138d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTranslationZ;
139acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
140acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
141acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotation(float rotation) {
142d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotation != mPrimitiveFields.mRotation) {
143d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotation = rotation;
144f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
145acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
146acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
147acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
148acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotation() const {
149d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotation;
150acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
151acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
152acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationX(float rotationX) {
153d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationX != mPrimitiveFields.mRotationX) {
154d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationX = rotationX;
155f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
156acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
157acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
158acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
159acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationX() const {
160d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationX;
161acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
162acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
163acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRotationY(float rotationY) {
164d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (rotationY != mPrimitiveFields.mRotationY) {
165d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRotationY = rotationY;
166f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
167acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
168acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
169acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
170acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRotationY() const {
171d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRotationY;
172acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
173acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
174acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleX(float scaleX) {
175d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleX != mPrimitiveFields.mScaleX) {
176d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleX = scaleX;
177f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
178acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
179acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
180acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
181acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleX() const {
182d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleX;
183acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
184acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
185acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setScaleY(float scaleY) {
186d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (scaleY != mPrimitiveFields.mScaleY) {
187d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mScaleY = scaleY;
188f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
189acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
190acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
191acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
192acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getScaleY() const {
193d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mScaleY;
194acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
195acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
196acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotX(float pivotX) {
197d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotX = pivotX;
198f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        mPrimitiveFields.mMatrixOrPivotDirty = true;
199d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
200acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
201acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
202d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /* Note that getPivotX and getPivotY are adjusted by updateMatrix(),
203d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * so the value returned mPrimitiveFields.may be stale if the RenderProperties has been
204d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * mPrimitiveFields.modified since the last call to updateMatrix()
205d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
206d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotX() const {
207d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotX;
208d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
209acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
210acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setPivotY(float pivotY) {
211d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotY = pivotY;
212f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        mPrimitiveFields.mMatrixOrPivotDirty = true;
213d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mPivotExplicitlySet = true;
214acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
215acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
216d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    float getPivotY() const {
217d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mPivotY;
218d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
219acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
22049e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    bool isPivotExplicitlySet() const {
22149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return mPrimitiveFields.mPivotExplicitlySet;
22249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    }
22349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
224acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCameraDistance(float distance) {
22549e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        if (distance != getCameraDistance()) {
226f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            mPrimitiveFields.mMatrixOrPivotDirty = true;
22749e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik            mComputedFields.mTransformCamera.setCameraLocation(0, 0, distance);
228acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
229acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
230acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
231acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getCameraDistance() const {
23249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        // TODO: update getCameraLocationZ() to be const
23349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        return const_cast<Sk3DView*>(&mComputedFields.mTransformCamera)->getCameraLocationZ();
234acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
235acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
236acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeft(int left) {
237d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft) {
238d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
239d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
240f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
241f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
242acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
243acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
244acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
245acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
246acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getLeft() const {
247d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mLeft;
248acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
249acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
250acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setTop(int top) {
251d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (top != mPrimitiveFields.mTop) {
252d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
253d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
254f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
255f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
256acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
257acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
258acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
259acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
260acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getTop() const {
261d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mTop;
262acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
263acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
264acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setRight(int right) {
265d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (right != mPrimitiveFields.mRight) {
266d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
267d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
268f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
269f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
270acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
271acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
272acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
273acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
274acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getRight() const {
275d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mRight;
276acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
277acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
278acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setBottom(int bottom) {
279d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (bottom != mPrimitiveFields.mBottom) {
280d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
281d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
282f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
283f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
284acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
285acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
286acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
287acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
288acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    float getBottom() const {
289d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mBottom;
290acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
291acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
292acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTop(int left, int top) {
293d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop) {
294d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
295d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
296d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
297d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
298f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
299f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
300acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
301acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
302acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
303acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
304acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setLeftTopRightBottom(int left, int top, int right, int bottom) {
305d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        if (left != mPrimitiveFields.mLeft || top != mPrimitiveFields.mTop || right != mPrimitiveFields.mRight || bottom != mPrimitiveFields.mBottom) {
306d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft = left;
307d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop = top;
308d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight = right;
309d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom = bottom;
310d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mWidth = mPrimitiveFields.mRight - mPrimitiveFields.mLeft;
311d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mHeight = mPrimitiveFields.mBottom - mPrimitiveFields.mTop;
312f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
313f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
314acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
315acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
316acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
317acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
318acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetLeftRight(float offset) {
319acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
320d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mLeft += offset;
321d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mRight += offset;
322f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
323f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
324acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
325acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
326acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
327acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
328acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void offsetTopBottom(float offset) {
329acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        if (offset != 0) {
330d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mTop += offset;
331d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck            mPrimitiveFields.mBottom += offset;
332f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck            if (!mPrimitiveFields.mPivotExplicitlySet) {
333f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck                mPrimitiveFields.mMatrixOrPivotDirty = true;
334acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck            }
335acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck        }
336acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
337acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
338acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    void setCaching(bool caching) {
339d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        mPrimitiveFields.mCaching = caching;
340acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
341acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
342b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getWidth() const {
343d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mWidth;
344acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
345acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
346b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    int getHeight() const {
347d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHeight;
348d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
349d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
350d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const SkMatrix* getAnimationMatrix() const {
351d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mAnimationMatrix;
352d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
353d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
354f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool hasTransformMatrix() const {
355f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix() && !getTransformMatrix()->isIdentity();
356f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    }
357f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck
358f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    // May only call this if hasTransformMatrix() is true
359f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck    bool isTransformTranslateOnly() const {
360f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        return getTransformMatrix()->getType() == SkMatrix::kTranslate_Mask;
361d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
362d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
36349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik    const SkMatrix* getTransformMatrix() const {
364f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        LOG_ALWAYS_FATAL_IF(mPrimitiveFields.mMatrixOrPivotDirty, "Cannot get a dirty matrix!");
365d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mComputedFields.mTransformMatrix;
366d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
367d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
368d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getCaching() const {
369d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mCaching;
370acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    }
371acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
372d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getClipToBounds() const {
373d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mClipToBounds;
374d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
375d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
376d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getHasOverlappingRendering() const {
377d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mHasOverlappingRendering;
378d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
379d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
380d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    const Outline& getOutline() const {
381d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
382d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
383d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
3848c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const RevealClip& getRevealClip() const {
3858c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
3868c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
3878c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
388d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    bool getProjectBackwards() const {
389d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mProjectBackwards;
390d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    }
391d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
392d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    void debugOutputProperties(const int level) const;
393d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
394d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    ANDROID_API void updateMatrix();
395d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
3968c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    ANDROID_API void updateClipPath();
3978c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
3988c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    // signals that mComputedFields.mClipPath is up to date, and should be used for clipping
3998c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    bool hasClippingPath() const {
4008c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mOutline.willClip() || mPrimitiveFields.mRevealClip.willClip();
4018c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4028c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4038c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    const SkPath* getClippingPath() const {
4048c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return hasClippingPath() ? mComputedFields.mClipPath : NULL;
4058c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4068c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
4078c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    SkRegion::Op getClippingPathOp() const {
4088c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mComputedFields.mClipPathOp;
4098c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4108c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
411d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    Outline& mutableOutline() {
412d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        return mPrimitiveFields.mOutline;
413b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik    }
414b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik
4158c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    RevealClip& mutableRevealClip() {
4168c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        return mPrimitiveFields.mRevealClip;
4178c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik    }
4188c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik
419acb6f07623b7df3d4179f70ae03ade574616ffa6John Reckprivate:
420acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
421acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    // Rendering properties
422d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct PrimitiveFields {
423d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        PrimitiveFields();
424d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
425d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        Outline mOutline;
4268c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        RevealClip mRevealClip;
427d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mClipToBounds;
428d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectBackwards;
429d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mProjectionReceiver;
430d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mAlpha;
431d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mHasOverlappingRendering;
432d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mTranslationX, mTranslationY, mTranslationZ;
433d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mRotation, mRotationX, mRotationY;
434d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mScaleX, mScaleY;
435d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        float mPivotX, mPivotY;
436d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mLeft, mTop, mRight, mBottom;
437d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        int mWidth, mHeight;
438d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mPivotExplicitlySet;
439f7483e3af0513a1baa8341d403df2e0c0896a9ffJohn Reck        bool mMatrixOrPivotDirty;
440d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        bool mCaching;
441d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mPrimitiveFields;
442d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
443d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    // mCameraDistance isn't in mPrimitiveFields as it has a complex setter
444acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mStaticMatrix;
445acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck    SkMatrix* mAnimationMatrix;
446acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
447d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    /**
448d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     * These fields are all generated from other properties and are not set directly.
449d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck     */
450d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    struct ComputedFields {
451d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ComputedFields();
452d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        ~ComputedFields();
453d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck
454d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck        /**
455d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * Stores the total transformation of the DisplayList based upon its scalar
456d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         * translate/rotate/scale properties.
457d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         *
45849e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * In the common translation-only case, the matrix isn't necessarily allocated,
45949e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik         * and the mTranslation properties are used directly.
460d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck         */
46149e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        SkMatrix* mTransformMatrix;
46249e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik
46349e6c73913e9bee58ea5e3984be151ee8e033163Chris Craik        Sk3DView mTransformCamera;
4648c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        SkPath* mClipPath; // TODO: remove this, create new ops for efficient/special case clipping
4658c271ca63b62061fd22cfee78fd6a574b44476fdChris Craik        SkRegion::Op mClipPathOp;
466d0a0b2a3140bfb1819a116413ce9d81886697a07John Reck    } mComputedFields;
467acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck};
468acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
469acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace uirenderer */
470acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck} /* namespace android */
471acb6f07623b7df3d4179f70ae03ade574616ffa6John Reck
472b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik#endif /* RENDERNODEPROPERTIES_H */
473