summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-05-18 10:58:45 -0700
committerRomain Guy <romainguy@google.com>2012-05-18 10:58:45 -0700
commitf26c8be01bb218619e073a209c9d57fe9d26c517 (patch)
tree6b00b9fb738143b19c3e3ec2496becc0e5309722 /libs
parent7e22a223afa63c591ef56cb325163e5e82046822 (diff)
downloadframeworks_base-f26c8be01bb218619e073a209c9d57fe9d26c517.zip
frameworks_base-f26c8be01bb218619e073a209c9d57fe9d26c517.tar.gz
frameworks_base-f26c8be01bb218619e073a209c9d57fe9d26c517.tar.bz2
Sanitize display list properties
The comparisons used in the various properties setters could fail badly in some specific conditions. The scale properties in particular did not use the same comparisons. This change also clamps alpha to the 0..1 range which avoids overflow issues with lowp registers in GLSL computations. Change-Id: I3e73b584e907a14e2c33d0865ca0d2d4d5bff31d
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/DisplayListRenderer.h19
-rw-r--r--libs/hwui/OpenGLRenderer.h2
-rw-r--r--libs/hwui/utils/Compare.h4
3 files changed, 11 insertions, 14 deletions
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 93b065d..0ba4078 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -170,9 +170,10 @@ public:
}
void setAlpha(float alpha) {
+ alpha = fminf(1.0f, fmaxf(0.0f, alpha));
if (alpha != mAlpha) {
mAlpha = alpha;
- mMultipliedAlpha = (int)(255 * alpha);
+ mMultipliedAlpha = (int) (255 * alpha);
}
}
@@ -184,7 +185,7 @@ public:
if (translationX != mTranslationX) {
mTranslationX = translationX;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
+ if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
mMatrixFlags &= ~TRANSLATION;
} else {
mMatrixFlags |= TRANSLATION;
@@ -196,7 +197,7 @@ public:
if (translationY != mTranslationY) {
mTranslationY = translationY;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mTranslationX, 0) && ALMOST_EQUAL(mTranslationY, 0)) {
+ if (mTranslationX == 0.0f && mTranslationY == 0.0f) {
mMatrixFlags &= ~TRANSLATION;
} else {
mMatrixFlags |= TRANSLATION;
@@ -208,7 +209,7 @@ public:
if (rotation != mRotation) {
mRotation = rotation;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mRotation, 0)) {
+ if (mRotation == 0.0f) {
mMatrixFlags &= ~ROTATION;
} else {
mMatrixFlags |= ROTATION;
@@ -220,7 +221,7 @@ public:
if (rotationX != mRotationX) {
mRotationX = rotationX;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
+ if (mRotationX == 0.0f && mRotationY == 0.0f) {
mMatrixFlags &= ~ROTATION_3D;
} else {
mMatrixFlags |= ROTATION_3D;
@@ -232,7 +233,7 @@ public:
if (rotationY != mRotationY) {
mRotationY = rotationY;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mRotationX, 0) && ALMOST_EQUAL(mRotationY, 0)) {
+ if (mRotationX == 0.0f && mRotationY == 0.0f) {
mMatrixFlags &= ~ROTATION_3D;
} else {
mMatrixFlags |= ROTATION_3D;
@@ -244,7 +245,7 @@ public:
if (scaleX != mScaleX) {
mScaleX = scaleX;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mScaleX, 1) && ALMOST_EQUAL(mScaleY, 1)) {
+ if (mScaleX == 1.0f && mScaleY == 1.0f) {
mMatrixFlags &= ~SCALE;
} else {
mMatrixFlags |= SCALE;
@@ -267,7 +268,7 @@ public:
void setPivotX(float pivotX) {
mPivotX = pivotX;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
+ if (mPivotX == 0.0f && mPivotY == 0.0f) {
mMatrixFlags &= ~PIVOT;
} else {
mMatrixFlags |= PIVOT;
@@ -278,7 +279,7 @@ public:
void setPivotY(float pivotY) {
mPivotY = pivotY;
mMatrixDirty = true;
- if (ALMOST_EQUAL(mPivotX, 0) && ALMOST_EQUAL(mPivotY, 0)) {
+ if (mPivotX == 0.0f && mPivotY == 0.0f) {
mMatrixFlags &= ~PIVOT;
} else {
mMatrixFlags |= PIVOT;
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index ab324ff..bf136ad 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -90,7 +90,7 @@ public:
virtual int saveLayerAlpha(float left, float top, float right, float bottom,
int alpha, int flags);
- virtual void setAlpha(float alpha) {
+ void setAlpha(float alpha) {
mSnapshot->alpha = alpha;
}
diff --git a/libs/hwui/utils/Compare.h b/libs/hwui/utils/Compare.h
index f079a7b..fdd9acf 100644
--- a/libs/hwui/utils/Compare.h
+++ b/libs/hwui/utils/Compare.h
@@ -19,10 +19,6 @@
#include <cmath>
-#define EPSILON 0.00001f
-
-#define ALMOST_EQUAL(u, v) (fabs((u) - (v)) < EPSILON)
-
/**
* Compare floats.
*/