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