From f26c8be01bb218619e073a209c9d57fe9d26c517 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 18 May 2012 10:58:45 -0700 Subject: [PATCH] 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 --- libs/hwui/DisplayListRenderer.h | 19 ++++++++++--------- libs/hwui/OpenGLRenderer.h | 2 +- libs/hwui/utils/Compare.h | 4 ---- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h index 93b065dbfecc2..0ba4078e61e8d 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 ab324ffc1c23a..bf136add28941 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 f079a7bf02d8a..fdd9acf7a6e35 100644 --- a/libs/hwui/utils/Compare.h +++ b/libs/hwui/utils/Compare.h @@ -19,10 +19,6 @@ #include -#define EPSILON 0.00001f - -#define ALMOST_EQUAL(u, v) (fabs((u) - (v)) < EPSILON) - /** * Compare floats. */