Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 690a0c9a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix even dimmer mappings + transition point" into main

parents 267a78ee dabbf8fe
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -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<>();

@@ -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
+35 −19
Original line number Diff line number Diff line
@@ -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
@@ -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];
@@ -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),
+31 −5
Original line number Diff line number Diff line
@@ -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">
@@ -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">
+19 −3
Original line number Diff line number Diff line
@@ -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();
@@ -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();
@@ -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);
+23 −13
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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"