Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +7 −7 Original line number Diff line number Diff line Loading @@ -82,11 +82,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular"; // Min and max strengths for even dimmer feature. private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f; private static final float EVEN_DIMMER_MAX_STRENGTH = 70.0f; // not too dim yet. private static final float EVEN_DIMMER_MAX_STRENGTH = 90.0f; private static final float BRIGHTNESS_MIN = 0.0f; // The brightness at which we start using color matrices rather than backlight, // to dim the display private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f; private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>(); Loading Loading @@ -995,9 +992,12 @@ final class LocalDisplayAdapter extends DisplayAdapter { private void applyColorMatrixBasedDimming(float brightnessState) { int strength = (int) (MathUtils.constrainedMap( EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range brightnessState) + 0.5); // map this (+ rounded up) // to this range: EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // from this range: BRIGHTNESS_MIN, mDisplayDeviceConfig.getEvenDimmerTransitionPoint(), // map this (+ rounded up): brightnessState) + 0.5); if (mEvenDimmerStrength < 0 // uninitialised || MathUtils.abs(mEvenDimmerStrength - strength) > 1 Loading services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java +35 −19 Original line number Diff line number Diff line Loading @@ -66,6 +66,10 @@ public class EvenDimmerBrightnessData { * Spline, mapping between backlight and brightness */ public final Spline mBacklightToBrightness; /** * Spline, mapping the minimum nits for each lux condition. */ public final Spline mMinLuxToNits; @VisibleForTesting Loading Loading @@ -114,34 +118,35 @@ public class EvenDimmerBrightnessData { return null; } List<Float> nitsList = lbm.getNits(); List<Float> backlightList = lbm.getBacklight(); List<Float> brightnessList = lbm.getBrightness(); float transitionPoints = lbm.getTransitionPoint().floatValue(); ComprehensiveBrightnessMap map = lbm.getBrightnessMapping(); if (map == null) { return null; } String interpolation = map.getInterpolation(); if (nitsList.isEmpty() || backlightList.size() != brightnessList.size() || backlightList.size() != nitsList.size()) { Slog.e(TAG, "Invalid even dimmer array lengths"); List<BrightnessPoint> brightnessPoints = map.getBrightnessPoint(); if (brightnessPoints.isEmpty()) { return null; } float[] nits = new float[nitsList.size()]; float[] backlight = new float[nitsList.size()]; float[] brightness = new float[nitsList.size()]; float[] nits = new float[brightnessPoints.size()]; float[] backlight = new float[brightnessPoints.size()]; float[] brightness = new float[brightnessPoints.size()]; for (int i = 0; i < nitsList.size(); i++) { nits[i] = nitsList.get(i); backlight[i] = backlightList.get(i); brightness[i] = brightnessList.get(i); for (int i = 0; i < brightnessPoints.size(); i++) { BrightnessPoint val = brightnessPoints.get(i); nits[i] = val.getNits().floatValue(); backlight[i] = val.getBacklight().floatValue(); brightness[i] = val.getBrightness().floatValue(); } final NitsMap map = lbm.getLuxToMinimumNitsMap(); if (map == null) { float transitionPoint = lbm.getTransitionPoint().floatValue(); final NitsMap minimumNitsMap = lbm.getLuxToMinimumNitsMap(); if (minimumNitsMap == null) { Slog.e(TAG, "Invalid min lux to nits mapping"); return null; } final List<Point> points = map.getPoint(); final List<Point> points = minimumNitsMap.getPoint(); final int size = points.size(); float[] minLux = new float[size]; Loading @@ -164,7 +169,18 @@ public class EvenDimmerBrightnessData { ++i; } return new EvenDimmerBrightnessData(transitionPoints, nits, backlight, brightness, // Explicitly choose linear interpolation. if ("linear".equals(interpolation)) { return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness, new Spline.LinearSpline(backlight, nits), new Spline.LinearSpline(nits, backlight), new Spline.LinearSpline(brightness, backlight), new Spline.LinearSpline(backlight, brightness), new Spline.LinearSpline(minLux, minNits) ); } return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness, Spline.createSpline(backlight, nits), Spline.createSpline(nits, backlight), Spline.createSpline(brightness, backlight), Loading services/core/xsd/display-device-config/display-device-config.xsd +31 −5 Original line number Diff line number Diff line Loading @@ -226,11 +226,8 @@ <xs:element name="transitionPoint" type="nonNegativeDecimal" minOccurs="1" maxOccurs="1"> </xs:element> <xs:element name="nits" type="xs:float" maxOccurs="unbounded"> </xs:element> <xs:element name="backlight" type="xs:float" maxOccurs="unbounded"> </xs:element> <xs:element name="brightness" type="xs:float" maxOccurs="unbounded"> <!-- Mapping of nits -> backlight -> brightness --> <xs:element name="brightnessMapping" type="comprehensiveBrightnessMap" maxOccurs="1"> </xs:element> <!-- Mapping of current lux to minimum allowed nits values. --> <xs:element name="luxToMinimumNitsMap" type="nitsMap" maxOccurs="1"> Loading Loading @@ -449,6 +446,35 @@ </xs:sequence> </xs:complexType> <xs:complexType name="comprehensiveBrightnessMap"> <xs:sequence> <xs:element name="brightnessPoint" type="brightnessPoint" maxOccurs="unbounded" minOccurs="2"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> </xs:sequence> <!-- valid value of interpolation if specified: linear --> <xs:attribute name="interpolation" type="xs:string" use="optional"/> </xs:complexType> <xs:complexType name="brightnessPoint"> <xs:sequence> <xs:element type="nonNegativeDecimal" name="nits"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> <xs:element type="nonNegativeDecimal" name="backlight"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> <xs:element type="nonNegativeDecimal" name="brightness"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="sdrHdrRatioMap"> <xs:sequence> <xs:element name="point" type="sdrHdrRatioPoint" maxOccurs="unbounded" minOccurs="2"> Loading services/core/xsd/display-device-config/schema/current.txt +19 −3 Original line number Diff line number Diff line Loading @@ -53,6 +53,16 @@ package com.android.server.display.config { method public final void setType(@NonNull com.android.server.display.config.PredefinedBrightnessLimitNames); } public class BrightnessPoint { ctor public BrightnessPoint(); method @NonNull public final java.math.BigDecimal getBacklight(); method @NonNull public final java.math.BigDecimal getBrightness(); method @NonNull public final java.math.BigDecimal getNits(); method public final void setBacklight(@NonNull java.math.BigDecimal); method public final void setBrightness(@NonNull java.math.BigDecimal); method public final void setNits(@NonNull java.math.BigDecimal); } public class BrightnessThresholds { ctor public BrightnessThresholds(); method public final com.android.server.display.config.ThresholdPoints getBrightnessThresholdPoints(); Loading @@ -76,6 +86,13 @@ package com.android.server.display.config { method public final void setThermalStatus(@NonNull com.android.server.display.config.ThermalStatus); } public class ComprehensiveBrightnessMap { ctor public ComprehensiveBrightnessMap(); method @NonNull public final java.util.List<com.android.server.display.config.BrightnessPoint> getBrightnessPoint(); method public String getInterpolation(); method public void setInterpolation(String); } public class Density { ctor public Density(); method @NonNull public final java.math.BigInteger getDensity(); Loading Loading @@ -183,12 +200,11 @@ package com.android.server.display.config { public class EvenDimmerMode { ctor public EvenDimmerMode(); method public java.util.List<java.lang.Float> getBacklight(); method public java.util.List<java.lang.Float> getBrightness(); method public com.android.server.display.config.ComprehensiveBrightnessMap getBrightnessMapping(); method public boolean getEnabled(); method public com.android.server.display.config.NitsMap getLuxToMinimumNitsMap(); method public java.util.List<java.lang.Float> getNits(); method public java.math.BigDecimal getTransitionPoint(); method public void setBrightnessMapping(com.android.server.display.config.ComprehensiveBrightnessMap); method public void setEnabled(boolean); method public void setLuxToMinimumNitsMap(com.android.server.display.config.NitsMap); method public void setTransitionPoint(java.math.BigDecimal); Loading services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +23 −13 Original line number Diff line number Diff line Loading @@ -924,7 +924,7 @@ public final class DisplayDeviceConfigTest { getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ true)); assertTrue(mDisplayDeviceConfig.isEvenDimmerAvailable()); assertEquals(0.0001f, mDisplayDeviceConfig.getBacklightFromBrightness(0.1f), ZERO_DELTA); assertEquals(0.01f, mDisplayDeviceConfig.getBacklightFromBrightness(0.002f), ZERO_DELTA); assertEquals(0.2f, mDisplayDeviceConfig.getNitsFromBacklight(0.0f), ZERO_DELTA); } Loading Loading @@ -1649,18 +1649,28 @@ public final class DisplayDeviceConfigTest { private String evenDimmerConfig(boolean enabled) { return (enabled ? "<evenDimmer enabled=\"true\">" : "<evenDimmer enabled=\"false\">") + " <transitionPoint>0.1</transitionPoint>\n" + " <brightnessMapping>\n" + " <brightnessPoint>\n" + " <nits>0.2</nits>\n" + " <backlight>0</backlight>\n" + " <brightness>0</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>2.0</nits>\n" + " <backlight>0.01</backlight>\n" + " <brightness>0.002</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>500.0</nits>\n" + " <nits>1000.0</nits>\n" + " <backlight>0</backlight>\n" + " <backlight>0.0001</backlight>\n" + " <backlight>0.5</backlight>\n" + " <backlight>1.0</backlight>\n" + " <brightness>0</brightness>\n" + " <brightness>0.1</brightness>\n" + " <brightness>0.5</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>1000</nits>\n" + " <backlight>1.0</backlight>\n" + " <brightness>1.0</brightness>\n" + " </brightnessPoint>\n" + " </brightnessMapping>\n" + " <luxToMinimumNitsMap>\n" + " <point>\n" + " <value>10</value> <nits>0.3</nits>\n" Loading Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +7 −7 Original line number Diff line number Diff line Loading @@ -82,11 +82,8 @@ final class LocalDisplayAdapter extends DisplayAdapter { private static final String PROPERTY_EMULATOR_CIRCULAR = "ro.boot.emulator.circular"; // Min and max strengths for even dimmer feature. private static final float EVEN_DIMMER_MIN_STRENGTH = 0.0f; private static final float EVEN_DIMMER_MAX_STRENGTH = 70.0f; // not too dim yet. private static final float EVEN_DIMMER_MAX_STRENGTH = 90.0f; private static final float BRIGHTNESS_MIN = 0.0f; // The brightness at which we start using color matrices rather than backlight, // to dim the display private static final float BACKLIGHT_COLOR_TRANSITION_POINT = 0.1f; private final LongSparseArray<LocalDisplayDevice> mDevices = new LongSparseArray<>(); Loading Loading @@ -995,9 +992,12 @@ final class LocalDisplayAdapter extends DisplayAdapter { private void applyColorMatrixBasedDimming(float brightnessState) { int strength = (int) (MathUtils.constrainedMap( EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // to this range BRIGHTNESS_MIN, BACKLIGHT_COLOR_TRANSITION_POINT, // from this range brightnessState) + 0.5); // map this (+ rounded up) // to this range: EVEN_DIMMER_MAX_STRENGTH, EVEN_DIMMER_MIN_STRENGTH, // from this range: BRIGHTNESS_MIN, mDisplayDeviceConfig.getEvenDimmerTransitionPoint(), // map this (+ rounded up): brightnessState) + 0.5); if (mEvenDimmerStrength < 0 // uninitialised || MathUtils.abs(mEvenDimmerStrength - strength) > 1 Loading
services/core/java/com/android/server/display/config/EvenDimmerBrightnessData.java +35 −19 Original line number Diff line number Diff line Loading @@ -66,6 +66,10 @@ public class EvenDimmerBrightnessData { * Spline, mapping between backlight and brightness */ public final Spline mBacklightToBrightness; /** * Spline, mapping the minimum nits for each lux condition. */ public final Spline mMinLuxToNits; @VisibleForTesting Loading Loading @@ -114,34 +118,35 @@ public class EvenDimmerBrightnessData { return null; } List<Float> nitsList = lbm.getNits(); List<Float> backlightList = lbm.getBacklight(); List<Float> brightnessList = lbm.getBrightness(); float transitionPoints = lbm.getTransitionPoint().floatValue(); ComprehensiveBrightnessMap map = lbm.getBrightnessMapping(); if (map == null) { return null; } String interpolation = map.getInterpolation(); if (nitsList.isEmpty() || backlightList.size() != brightnessList.size() || backlightList.size() != nitsList.size()) { Slog.e(TAG, "Invalid even dimmer array lengths"); List<BrightnessPoint> brightnessPoints = map.getBrightnessPoint(); if (brightnessPoints.isEmpty()) { return null; } float[] nits = new float[nitsList.size()]; float[] backlight = new float[nitsList.size()]; float[] brightness = new float[nitsList.size()]; float[] nits = new float[brightnessPoints.size()]; float[] backlight = new float[brightnessPoints.size()]; float[] brightness = new float[brightnessPoints.size()]; for (int i = 0; i < nitsList.size(); i++) { nits[i] = nitsList.get(i); backlight[i] = backlightList.get(i); brightness[i] = brightnessList.get(i); for (int i = 0; i < brightnessPoints.size(); i++) { BrightnessPoint val = brightnessPoints.get(i); nits[i] = val.getNits().floatValue(); backlight[i] = val.getBacklight().floatValue(); brightness[i] = val.getBrightness().floatValue(); } final NitsMap map = lbm.getLuxToMinimumNitsMap(); if (map == null) { float transitionPoint = lbm.getTransitionPoint().floatValue(); final NitsMap minimumNitsMap = lbm.getLuxToMinimumNitsMap(); if (minimumNitsMap == null) { Slog.e(TAG, "Invalid min lux to nits mapping"); return null; } final List<Point> points = map.getPoint(); final List<Point> points = minimumNitsMap.getPoint(); final int size = points.size(); float[] minLux = new float[size]; Loading @@ -164,7 +169,18 @@ public class EvenDimmerBrightnessData { ++i; } return new EvenDimmerBrightnessData(transitionPoints, nits, backlight, brightness, // Explicitly choose linear interpolation. if ("linear".equals(interpolation)) { return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness, new Spline.LinearSpline(backlight, nits), new Spline.LinearSpline(nits, backlight), new Spline.LinearSpline(brightness, backlight), new Spline.LinearSpline(backlight, brightness), new Spline.LinearSpline(minLux, minNits) ); } return new EvenDimmerBrightnessData(transitionPoint, nits, backlight, brightness, Spline.createSpline(backlight, nits), Spline.createSpline(nits, backlight), Spline.createSpline(brightness, backlight), Loading
services/core/xsd/display-device-config/display-device-config.xsd +31 −5 Original line number Diff line number Diff line Loading @@ -226,11 +226,8 @@ <xs:element name="transitionPoint" type="nonNegativeDecimal" minOccurs="1" maxOccurs="1"> </xs:element> <xs:element name="nits" type="xs:float" maxOccurs="unbounded"> </xs:element> <xs:element name="backlight" type="xs:float" maxOccurs="unbounded"> </xs:element> <xs:element name="brightness" type="xs:float" maxOccurs="unbounded"> <!-- Mapping of nits -> backlight -> brightness --> <xs:element name="brightnessMapping" type="comprehensiveBrightnessMap" maxOccurs="1"> </xs:element> <!-- Mapping of current lux to minimum allowed nits values. --> <xs:element name="luxToMinimumNitsMap" type="nitsMap" maxOccurs="1"> Loading Loading @@ -449,6 +446,35 @@ </xs:sequence> </xs:complexType> <xs:complexType name="comprehensiveBrightnessMap"> <xs:sequence> <xs:element name="brightnessPoint" type="brightnessPoint" maxOccurs="unbounded" minOccurs="2"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> </xs:sequence> <!-- valid value of interpolation if specified: linear --> <xs:attribute name="interpolation" type="xs:string" use="optional"/> </xs:complexType> <xs:complexType name="brightnessPoint"> <xs:sequence> <xs:element type="nonNegativeDecimal" name="nits"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> <xs:element type="nonNegativeDecimal" name="backlight"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> <xs:element type="nonNegativeDecimal" name="brightness"> <xs:annotation name="nonnull"/> <xs:annotation name="final"/> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="sdrHdrRatioMap"> <xs:sequence> <xs:element name="point" type="sdrHdrRatioPoint" maxOccurs="unbounded" minOccurs="2"> Loading
services/core/xsd/display-device-config/schema/current.txt +19 −3 Original line number Diff line number Diff line Loading @@ -53,6 +53,16 @@ package com.android.server.display.config { method public final void setType(@NonNull com.android.server.display.config.PredefinedBrightnessLimitNames); } public class BrightnessPoint { ctor public BrightnessPoint(); method @NonNull public final java.math.BigDecimal getBacklight(); method @NonNull public final java.math.BigDecimal getBrightness(); method @NonNull public final java.math.BigDecimal getNits(); method public final void setBacklight(@NonNull java.math.BigDecimal); method public final void setBrightness(@NonNull java.math.BigDecimal); method public final void setNits(@NonNull java.math.BigDecimal); } public class BrightnessThresholds { ctor public BrightnessThresholds(); method public final com.android.server.display.config.ThresholdPoints getBrightnessThresholdPoints(); Loading @@ -76,6 +86,13 @@ package com.android.server.display.config { method public final void setThermalStatus(@NonNull com.android.server.display.config.ThermalStatus); } public class ComprehensiveBrightnessMap { ctor public ComprehensiveBrightnessMap(); method @NonNull public final java.util.List<com.android.server.display.config.BrightnessPoint> getBrightnessPoint(); method public String getInterpolation(); method public void setInterpolation(String); } public class Density { ctor public Density(); method @NonNull public final java.math.BigInteger getDensity(); Loading Loading @@ -183,12 +200,11 @@ package com.android.server.display.config { public class EvenDimmerMode { ctor public EvenDimmerMode(); method public java.util.List<java.lang.Float> getBacklight(); method public java.util.List<java.lang.Float> getBrightness(); method public com.android.server.display.config.ComprehensiveBrightnessMap getBrightnessMapping(); method public boolean getEnabled(); method public com.android.server.display.config.NitsMap getLuxToMinimumNitsMap(); method public java.util.List<java.lang.Float> getNits(); method public java.math.BigDecimal getTransitionPoint(); method public void setBrightnessMapping(com.android.server.display.config.ComprehensiveBrightnessMap); method public void setEnabled(boolean); method public void setLuxToMinimumNitsMap(com.android.server.display.config.NitsMap); method public void setTransitionPoint(java.math.BigDecimal); Loading
services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +23 −13 Original line number Diff line number Diff line Loading @@ -924,7 +924,7 @@ public final class DisplayDeviceConfigTest { getValidProxSensor(), /* includeIdleMode= */ false, /* enableEvenDimmer */ true)); assertTrue(mDisplayDeviceConfig.isEvenDimmerAvailable()); assertEquals(0.0001f, mDisplayDeviceConfig.getBacklightFromBrightness(0.1f), ZERO_DELTA); assertEquals(0.01f, mDisplayDeviceConfig.getBacklightFromBrightness(0.002f), ZERO_DELTA); assertEquals(0.2f, mDisplayDeviceConfig.getNitsFromBacklight(0.0f), ZERO_DELTA); } Loading Loading @@ -1649,18 +1649,28 @@ public final class DisplayDeviceConfigTest { private String evenDimmerConfig(boolean enabled) { return (enabled ? "<evenDimmer enabled=\"true\">" : "<evenDimmer enabled=\"false\">") + " <transitionPoint>0.1</transitionPoint>\n" + " <brightnessMapping>\n" + " <brightnessPoint>\n" + " <nits>0.2</nits>\n" + " <backlight>0</backlight>\n" + " <brightness>0</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>2.0</nits>\n" + " <backlight>0.01</backlight>\n" + " <brightness>0.002</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>500.0</nits>\n" + " <nits>1000.0</nits>\n" + " <backlight>0</backlight>\n" + " <backlight>0.0001</backlight>\n" + " <backlight>0.5</backlight>\n" + " <backlight>1.0</backlight>\n" + " <brightness>0</brightness>\n" + " <brightness>0.1</brightness>\n" + " <brightness>0.5</brightness>\n" + " </brightnessPoint>\n" + " <brightnessPoint>\n" + " <nits>1000</nits>\n" + " <backlight>1.0</backlight>\n" + " <brightness>1.0</brightness>\n" + " </brightnessPoint>\n" + " </brightnessMapping>\n" + " <luxToMinimumNitsMap>\n" + " <point>\n" + " <value>10</value> <nits>0.3</nits>\n" Loading