summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Brown <jeffbrown@google.com>2014-08-22 03:42:47 -0700
committerJeff Brown <jeffbrown@google.com>2014-08-22 03:52:01 -0700
commit8864415e2a29daf504b52afe911eb5c5a8b03fc0 (patch)
tree84a7791ac0eb8383aaf7dba01b59007e27d23b60
parent1bfd0f463e279e3ac3f133c5e0ad11ccfd73eed5 (diff)
downloadframeworks_base-8864415e2a29daf504b52afe911eb5c5a8b03fc0.zip
frameworks_base-8864415e2a29daf504b52afe911eb5c5a8b03fc0.tar.gz
frameworks_base-8864415e2a29daf504b52afe911eb5c5a8b03fc0.tar.bz2
Fix matrix multiply in accessiblity display adjustments.
Fixed a bug caused by a missing temporary when swapping two matrices. This could produce undefined results in the case where both display inversion and the greyscale daltonizer were enabled simultaneously. Tightened up the code a little to make this kind of error less likely by removing redundant state. Removed the native prefix on some methods since they are not native at all. Change-Id: I716ffc8fbe76a304c60d45870074340c0121059f
-rw-r--r--services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java69
1 files changed, 29 insertions, 40 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
index 394c196..38827d0 100644
--- a/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
+++ b/services/accessibility/java/com/android/server/accessibility/DisplayAdjustmentUtils.java
@@ -60,15 +60,17 @@ class DisplayAdjustmentUtils {
public static boolean hasAdjustments(Context context, int userId) {
final ContentResolver cr = context.getContentResolver();
- boolean hasColorTransform = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
+ if (Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) {
+ return true;
+ }
- if (!hasColorTransform) {
- hasColorTransform |= Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) == 1;
+ if (Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
+ return true;
}
- return hasColorTransform;
+ return false;
}
/**
@@ -76,52 +78,39 @@ class DisplayAdjustmentUtils {
*/
public static void applyAdjustments(Context context, int userId) {
final ContentResolver cr = context.getContentResolver();
- float[] colorMatrix = new float[16];
- float[] outputMatrix = new float[16];
- boolean hasColorTransform = false;
-
- Matrix.setIdentityM(colorMatrix, 0);
-
- final boolean inversionEnabled = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) == 1;
- if (inversionEnabled) {
- final float[] inversionMatrix = INVERSION_MATRIX_VALUE_ONLY;
- Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, inversionMatrix, 0);
+ float[] colorMatrix = null;
- colorMatrix = outputMatrix;
- outputMatrix = colorMatrix;
-
- hasColorTransform = true;
+ if (Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0, userId) != 0) {
+ colorMatrix = multiply(colorMatrix, INVERSION_MATRIX_VALUE_ONLY);
}
- final boolean daltonizerEnabled = Settings.Secure.getIntForUser(
- cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0;
- if (daltonizerEnabled) {
+ if (Settings.Secure.getIntForUser(cr,
+ Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0, userId) != 0) {
final int daltonizerMode = Settings.Secure.getIntForUser(cr,
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, DEFAULT_DISPLAY_DALTONIZER,
userId);
// Monochromacy isn't supported by the native Daltonizer.
if (daltonizerMode == AccessibilityManager.DALTONIZER_SIMULATE_MONOCHROMACY) {
- Matrix.multiplyMM(outputMatrix, 0, colorMatrix, 0, GRAYSCALE_MATRIX, 0);
-
- final float[] temp = colorMatrix;
- colorMatrix = outputMatrix;
- outputMatrix = temp;
-
- hasColorTransform = true;
- nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ colorMatrix = multiply(colorMatrix, GRAYSCALE_MATRIX);
+ setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
} else {
- nativeSetDaltonizerMode(daltonizerMode);
+ setDaltonizerMode(daltonizerMode);
}
} else {
- nativeSetDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
+ setDaltonizerMode(AccessibilityManager.DALTONIZER_DISABLED);
}
- if (hasColorTransform) {
- nativeSetColorTransform(colorMatrix);
- } else {
- nativeSetColorTransform(null);
+ setColorTransform(colorMatrix);
+ }
+
+ private static float[] multiply(float[] matrix, float[] other) {
+ if (matrix == null) {
+ return other;
}
+ float[] result = new float[16];
+ Matrix.multiplyMM(result, 0, matrix, 0, other, 0);
+ return result;
}
/**
@@ -130,7 +119,7 @@ class DisplayAdjustmentUtils {
*
* @param mode new Daltonization mode
*/
- private static void nativeSetDaltonizerMode(int mode) {
+ private static void setDaltonizerMode(int mode) {
try {
final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
if (flinger != null) {
@@ -152,7 +141,7 @@ class DisplayAdjustmentUtils {
* @param m the float array that holds the transformation matrix, or null to
* disable transformation
*/
- private static void nativeSetColorTransform(float[] m) {
+ private static void setColorTransform(float[] m) {
try {
final IBinder flinger = ServiceManager.getService("SurfaceFlinger");
if (flinger != null) {