diff options
author | Jeff Brown <jeffbrown@google.com> | 2014-08-22 03:42:47 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2014-08-22 03:52:01 -0700 |
commit | 8864415e2a29daf504b52afe911eb5c5a8b03fc0 (patch) | |
tree | 84a7791ac0eb8383aaf7dba01b59007e27d23b60 | |
parent | 1bfd0f463e279e3ac3f133c5e0ad11ccfd73eed5 (diff) | |
download | frameworks_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.java | 69 |
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) { |