From 1110de33d563bcb1a9f55d4c69231d27f07a6695 Mon Sep 17 00:00:00 2001 From: Christine Franks Date: Tue, 25 Jan 2022 01:58:38 -0800 Subject: [PATCH] Compute DWB compensation for luminance drop Bug: 214402192 Test: atest FrameworksServicesTests:AmbientLuxTest Change-Id: Id61d6521d68f75d45d20b3a9ea3d1fba89410e05 --- .../display/color/ColorDisplayService.java | 7 ++++++- .../DisplayWhiteBalanceTintController.java | 12 ++++++++++++ .../DisplayWhiteBalanceController.java | 17 ++++++++++++++++- .../display/whitebalance/AmbientLuxTest.java | 16 ++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/display/color/ColorDisplayService.java b/services/core/java/com/android/server/display/color/ColorDisplayService.java index f9a1368ff3e80..80355262be0e2 100644 --- a/services/core/java/com/android/server/display/color/ColorDisplayService.java +++ b/services/core/java/com/android/server/display/color/ColorDisplayService.java @@ -1453,7 +1453,7 @@ public final class ColorDisplayService extends SystemService { /** * Local service that allows color transforms to be enabled from other system services. */ - public final class ColorDisplayServiceInternal { + public class ColorDisplayServiceInternal { /** * Set the current CCT value for the display white balance transform, and if the transform @@ -1472,6 +1472,11 @@ public final class ColorDisplayService extends SystemService { return false; } + /** Get the luminance of the current chromatic adaptation matrix. */ + public float getDisplayWhiteBalanceLuminance() { + return mDisplayWhiteBalanceTintController.getLuminance(); + } + /** * Reset the CCT value for the display white balance transform to its default value. */ diff --git a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java index bdbaaa86e9a11..936149c690f45 100644 --- a/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java +++ b/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java @@ -251,6 +251,18 @@ final class DisplayWhiteBalanceTintController extends TintController { } } + public float getLuminance() { + synchronized (mLock) { + if (mChromaticAdaptationMatrix != null && mChromaticAdaptationMatrix.length == 9) { + // Compute only the luminance (y) value of the xyz * [1 1 1] transform. + return 1 / (mChromaticAdaptationMatrix[1] + mChromaticAdaptationMatrix[4] + + mChromaticAdaptationMatrix[7]); + } else { + return -1; + } + } + } + private ColorSpace.Rgb makeRgbColorSpaceFromXYZ(float[] redGreenBlueXYZ, float[] whiteXYZ) { return new ColorSpace.Rgb( "Display Color Space", diff --git a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java index d64fcbc20767c..151ec81832695 100644 --- a/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java +++ b/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java @@ -21,7 +21,6 @@ import android.util.Slog; import android.util.Spline; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.display.color.ColorDisplayService.ColorDisplayServiceInternal; import com.android.server.display.utils.AmbientFilter; @@ -455,6 +454,22 @@ public class DisplayWhiteBalanceController implements mLastAmbientColorTemperature = mAmbientColorTemperature; } + /** + * Calculate the adjusted brightness, in nits, due to the DWB color adaptation + * + * @param requestedBrightnessNits brightness the framework requires to be output + * @return the adjusted brightness the framework needs to output to counter the drop in + * brightness due to DWB, or the requestedBrightnessNits if an adjustment cannot be made + */ + public float calculateAdjustedBrightnessNits(float requestedBrightnessNits) { + float luminance = mColorDisplayServiceInternal.getDisplayWhiteBalanceLuminance(); + if (luminance == -1) { + return requestedBrightnessNits; + } + float effectiveBrightness = requestedBrightnessNits * luminance; + return (requestedBrightnessNits - effectiveBrightness) + requestedBrightnessNits; + } + /** * The DisplayWhiteBalanceController decouples itself from its parent (DisplayPowerController) * by providing this interface to implement (and a method to set its callbacks object), and diff --git a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java index 2565ae3b4a85f..0f3742f8577dc 100644 --- a/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +++ b/services/tests/servicestests/src/com/android/server/display/whitebalance/AmbientLuxTest.java @@ -21,6 +21,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -37,7 +38,9 @@ import android.util.TypedValue; import androidx.test.InstrumentationRegistry; import com.android.internal.R; +import com.android.server.LocalServices; import com.android.server.display.TestUtils; +import com.android.server.display.color.ColorDisplayService; import com.android.server.display.utils.AmbientFilter; import com.android.server.display.utils.AmbientFilterStubber; @@ -75,6 +78,7 @@ public final class AmbientLuxTest { @Mock private TypedArray mHighLightBiases; @Mock private TypedArray mAmbientColorTemperatures; @Mock private TypedArray mDisplayColorTemperatures; + @Mock private ColorDisplayService.ColorDisplayServiceInternal mColorDisplayServiceInternalMock; @Before public void setUp() throws Exception { @@ -120,6 +124,18 @@ public final class AmbientLuxTest { R.array.config_displayWhiteBalanceHighLightAmbientBiases)) .thenReturn(mHighLightBiases); mockThrottler(); + LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); + LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class, + mColorDisplayServiceInternalMock); + } + + @Test + public void testCalculateAdjustedBrightnessNits() { + doReturn(0.9f).when(mColorDisplayServiceInternalMock).getDisplayWhiteBalanceLuminance(); + DisplayWhiteBalanceController controller = + DisplayWhiteBalanceFactory.create(mHandler, mSensorManagerMock, mResourcesSpy); + final float adjustedNits = controller.calculateAdjustedBrightnessNits(500f); + assertEquals(/* expected= */ 550f, adjustedNits, /* delta= */ 0.001); } @Test