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

Commit 5945ddbf authored by John Reck's avatar John Reck
Browse files

Add API to restrict HDR headroom

Bug: 234181960
Test: SilkFX
Change-Id: Ib29c85ad3c5f1bd5455b99c8578f9327d18b930f
parent 7d8b960b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -53129,6 +53129,7 @@ package android.view {
    method @Nullable public abstract android.view.View getCurrentFocus();
    method @NonNull public abstract android.view.View getDecorView();
    method public static int getDefaultFeatures(android.content.Context);
    method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public float getDesiredHdrHeadroom();
    method public android.transition.Transition getEnterTransition();
    method public android.transition.Transition getExitTransition();
    method protected final int getFeatures();
@@ -53198,6 +53199,7 @@ package android.view {
    method public abstract void setDecorCaptionShade(int);
    method public void setDecorFitsSystemWindows(boolean);
    method protected void setDefaultWindowFormat(int);
    method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public void setDesiredHdrHeadroom(@FloatRange(from=0.0f, to=10000.0) float);
    method public void setDimAmount(float);
    method public void setElevation(float);
    method public void setEnterTransition(android.transition.Transition);
@@ -53547,6 +53549,7 @@ package android.view {
    method public int describeContents();
    method public int getBlurBehindRadius();
    method public int getColorMode();
    method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public float getDesiredHdrHeadroom();
    method public int getFitInsetsSides();
    method public int getFitInsetsTypes();
    method public final CharSequence getTitle();
@@ -53556,6 +53559,7 @@ package android.view {
    method public void setBlurBehindRadius(@IntRange(from=0) int);
    method public void setCanPlayMoveAnimation(boolean);
    method public void setColorMode(int);
    method @FlaggedApi("com.android.graphics.hwui.flags.limited_hdr") public void setDesiredHdrHeadroom(@FloatRange(from=0.0f, to=10000.0f) float);
    method public void setFitInsetsIgnoringVisibility(boolean);
    method public void setFitInsetsSides(int);
    method public void setFitInsetsTypes(int);
+8 −4
Original line number Diff line number Diff line
@@ -1730,7 +1730,7 @@ public final class ViewRootImpl implements ViewParent,
                        attrs.getTitle().toString());
                mAttachInfo.mThreadedRenderer = renderer;
                renderer.setSurfaceControl(mSurfaceControl, mBlastBufferQueue);
                updateColorModeIfNeeded(attrs.getColorMode());
                updateColorModeIfNeeded(attrs.getColorMode(), attrs.getDesiredHdrHeadroom());
                updateRenderHdrSdrRatio();
                updateForceDarkMode();
                mAttachInfo.mHardwareAccelerated = true;
@@ -3349,7 +3349,7 @@ public final class ViewRootImpl implements ViewParent,
                }
                final boolean alwaysConsumeSystemBarsChanged =
                        mPendingAlwaysConsumeSystemBars != mAttachInfo.mAlwaysConsumeSystemBars;
                updateColorModeIfNeeded(lp.getColorMode());
                updateColorModeIfNeeded(lp.getColorMode(), lp.getDesiredHdrHeadroom());
                surfaceCreated = !hadSurface && mSurface.isValid();
                surfaceDestroyed = hadSurface && !mSurface.isValid();

@@ -5652,7 +5652,8 @@ public final class ViewRootImpl implements ViewParent,
        mUpdateHdrSdrRatioInfo = true;
    }

    private void updateColorModeIfNeeded(@ActivityInfo.ColorMode int colorMode) {
    private void updateColorModeIfNeeded(@ActivityInfo.ColorMode int colorMode,
            float desiredRatio) {
        if (mAttachInfo.mThreadedRenderer == null) {
            return;
        }
@@ -5666,7 +5667,10 @@ public final class ViewRootImpl implements ViewParent,
                && !getConfiguration().isScreenWideColorGamut()) {
            colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
        }
        float desiredRatio = mAttachInfo.mThreadedRenderer.setColorMode(colorMode);
        float automaticRatio = mAttachInfo.mThreadedRenderer.setColorMode(colorMode);
        if (desiredRatio == 0 || desiredRatio > automaticRatio) {
            desiredRatio = automaticRatio;
        }
        if (desiredRatio != mDesiredHdrSdrRatio) {
            mDesiredHdrSdrRatio = desiredRatio;
            updateRenderHdrSdrRatio();
+43 −0
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE

import android.annotation.ColorInt;
import android.annotation.DrawableRes;
import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.annotation.NonNull;
@@ -1329,6 +1331,47 @@ public abstract class Window {
        dispatchWindowAttributesChanged(attrs);
    }

    /**
     * <p>Sets the desired about of HDR headroom to be used when rendering as a ratio of
     * targetHdrPeakBrightnessInNits / targetSdrWhitePointInNits. Only applies when
     * {@link #setColorMode(int)} is {@link ActivityInfo#COLOR_MODE_HDR}</p>
     *
     * <p>By default the system will choose an amount of HDR headroom that is appropriate
     * for the underlying device capabilities & bit-depth of the panel. However, for some types
     * of content this can end up being more headroom than necessary or desired. An example
     * would be a messaging app or gallery thumbnail view where some amount of HDR pop is desired
     * without overly influencing the perceived brightness of the majority SDR content. This can
     * also be used to animate in/out of an HDR range for smoother transitions.</p>
     *
     * <p>Note: The actual amount of HDR headroom that will be given is subject to a variety
     * of factors such as ambient conditions, display capabilities, or bit-depth limitations.
     * See {@link Display#getHdrSdrRatio()} for more information as well as how to query the
     * current value.</p>
     *
     * @param desiredHeadroom The amount of HDR headroom that is desired. Must be >= 1.0 (no HDR)
     *                        and <= 10,000.0. Passing 0.0 will reset to the default, automatically
     *                        chosen value.
     * @see #getDesiredHdrHeadroom()
     * @see Display#getHdrSdrRatio()
     */
    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_LIMITED_HDR)
    public void setDesiredHdrHeadroom(
            @FloatRange(from = 0.0f, to = 10000.0) float desiredHeadroom) {
        final WindowManager.LayoutParams attrs = getAttributes();
        attrs.setDesiredHdrHeadroom(desiredHeadroom);
        dispatchWindowAttributesChanged(attrs);
    }

    /**
     * Get the desired amount of HDR headroom as set by {@link #setDesiredHdrHeadroom(float)}
     * @return The amount of HDR headroom set, or 0 for automatic/default behavior.
     * @see #setDesiredHdrHeadroom(float)
     */
    @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_LIMITED_HDR)
    public float getDesiredHdrHeadroom() {
        return getAttributes().getDesiredHdrHeadroom();
    }

    /**
     * If {@code isPreferred} is true, this method requests that the connected display does minimal
     * post processing when this window is visible on the screen. Otherwise, it requests that the
+47 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ import static android.view.WindowLayoutParamsProto.Y;
import android.Manifest.permission;
import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
@@ -4315,6 +4316,9 @@ public interface WindowManager extends ViewManager {
        @ActivityInfo.ColorMode
        private int mColorMode = COLOR_MODE_DEFAULT;

        /** @hide */
        private float mDesiredHdrHeadroom = 0;

        /**
         * Carries the requests about {@link WindowInsetsController.Appearance} and
         * {@link WindowInsetsController.Behavior} to the system windows which can produce insets.
@@ -4716,6 +4720,39 @@ public interface WindowManager extends ViewManager {
            return mColorMode;
        }

        /**
         * <p>Sets the desired about of HDR headroom to be used when rendering as a ratio of
         * targetHdrPeakBrightnessInNits / targetSdrWhitePointInNits. Only applies when
         * {@link #setColorMode(int)} is {@link ActivityInfo#COLOR_MODE_HDR}</p>
         *
         * @see Window#setDesiredHdrHeadroom(float)
         * @param desiredHeadroom Desired amount of HDR headroom. Must be in the range of 1.0 (SDR)
         *                        to 10,000.0, or 0.0 to reset to default.
         */
        @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_LIMITED_HDR)
        public void setDesiredHdrHeadroom(
                @FloatRange(from = 0.0f, to = 10000.0f) float desiredHeadroom) {
            if (!Float.isFinite(desiredHeadroom)) {
                throw new IllegalArgumentException("desiredHeadroom must be finite: "
                        + desiredHeadroom);
            }
            if (desiredHeadroom != 0 && (desiredHeadroom < 1.0f || desiredHeadroom > 10000.0f)) {
                throw new IllegalArgumentException(
                        "desiredHeadroom must be 0.0 or in the range [1.0, 10000.0f], received: "
                                + desiredHeadroom);
            }
            mDesiredHdrHeadroom = desiredHeadroom;
        }

        /**
         * Get the desired amount of HDR headroom as set by {@link #setDesiredHdrHeadroom(float)}
         * @return The amount of HDR headroom set, or 0 for automatic/default behavior.
         */
        @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_LIMITED_HDR)
        public float getDesiredHdrHeadroom() {
            return mDesiredHdrHeadroom;
        }

        /**
         * <p>
         * Blurs the screen behind the window. The effect is similar to that of {@link #dimAmount},
@@ -4866,6 +4903,7 @@ public interface WindowManager extends ViewManager {
            checkNonRecursiveParams();
            out.writeTypedArray(paramsForRotation, 0 /* parcelableFlags */);
            out.writeInt(mDisplayFlags);
            out.writeFloat(mDesiredHdrHeadroom);
        }

        public static final @android.annotation.NonNull Parcelable.Creator<LayoutParams> CREATOR
@@ -4937,6 +4975,7 @@ public interface WindowManager extends ViewManager {
            forciblyShownTypes = in.readInt();
            paramsForRotation = in.createTypedArray(LayoutParams.CREATOR);
            mDisplayFlags = in.readInt();
            mDesiredHdrHeadroom = in.readFloat();
        }

        @SuppressWarnings({"PointlessBitwiseExpression"})
@@ -5197,6 +5236,11 @@ public interface WindowManager extends ViewManager {
                changes |= COLOR_MODE_CHANGED;
            }

            if (mDesiredHdrHeadroom != o.mDesiredHdrHeadroom) {
                mDesiredHdrHeadroom = o.mDesiredHdrHeadroom;
                changes |= COLOR_MODE_CHANGED;
            }

            if (preferMinimalPostProcessing != o.preferMinimalPostProcessing) {
                preferMinimalPostProcessing = o.preferMinimalPostProcessing;
                changes |= MINIMAL_POST_PROCESSING_PREFERENCE_CHANGED;
@@ -5424,6 +5468,9 @@ public interface WindowManager extends ViewManager {
            if (mColorMode != COLOR_MODE_DEFAULT) {
                sb.append(" colorMode=").append(ActivityInfo.colorModeToString(mColorMode));
            }
            if (mDesiredHdrHeadroom != 0) {
                sb.append(" desiredHdrHeadroom=").append(mDesiredHdrHeadroom);
            }
            if (preferMinimalPostProcessing) {
                sb.append(" preferMinimalPostProcessing=");
                sb.append(preferMinimalPostProcessing);
+8 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ class ColorModeControls : LinearLayout, WindowObserver {
    private var window: Window? = null
    private var currentModeDisplay: TextView? = null

    private var desiredRatio = 0.0f

    override fun onFinishInflate() {
        super.onFinishInflate()
        val window = window ?: throw IllegalStateException("Failed to attach window")
@@ -67,6 +69,7 @@ class ColorModeControls : LinearLayout, WindowObserver {

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        desiredRatio = window?.desiredHdrHeadroom ?: 0.0f
        val hdrVis = if (display.isHdrSdrRatioAvailable) {
            display.registerHdrSdrRatioChangedListener({ it.run() }, hdrSdrListener)
            View.VISIBLE
@@ -83,6 +86,11 @@ class ColorModeControls : LinearLayout, WindowObserver {
    }

    private fun setColorMode(newMode: Int) {
        if (newMode == ActivityInfo.COLOR_MODE_HDR &&
                window!!.colorMode == ActivityInfo.COLOR_MODE_HDR) {
            desiredRatio = (desiredRatio + 1) % 5.0f
            window!!.desiredHdrHeadroom = desiredRatio
        }
        window!!.colorMode = newMode
        updateModeInfoDisplay()
    }