Loading core/java/android/view/HdrRenderState.java +30 −9 Original line number Original line Diff line number Diff line Loading @@ -31,9 +31,11 @@ class HdrRenderState implements Consumer<Display> { private final ViewRootImpl mViewRoot; private final ViewRootImpl mViewRoot; private boolean mIsHdrEnabled = false; private boolean mIsListenerRegistered = false; private boolean mIsListenerRegistered = false; private boolean mUpdateHdrSdrRatioInfo = false; private boolean mUpdateHdrSdrRatioInfo = false; private float mDesiredHdrSdrRatio = 1f; private float mDesiredHdrSdrRatio = 1f; private float mTargetDesiredHdrSdrRatio = 1f; private float mTargetHdrSdrRatio = 1f; private float mTargetHdrSdrRatio = 1f; private float mRenderHdrSdrRatio = 1f; private float mRenderHdrSdrRatio = 1f; private float mPreviousRenderRatio = 1f; private float mPreviousRenderRatio = 1f; Loading @@ -50,7 +52,7 @@ class HdrRenderState implements Consumer<Display> { } } boolean isHdrEnabled() { boolean isHdrEnabled() { return mDesiredHdrSdrRatio >= 1.01f; return mIsHdrEnabled; } } void stopListening() { void stopListening() { Loading @@ -75,9 +77,7 @@ class HdrRenderState implements Consumer<Display> { final float maxStep = timeDelta * TRANSITION_PER_MS; final float maxStep = timeDelta * TRANSITION_PER_MS; mLastUpdateMillis = frameTimeMillis; mLastUpdateMillis = frameTimeMillis; if (hasUpdate && FLAG_ANIMATE_ENABLED) { if (hasUpdate && FLAG_ANIMATE_ENABLED) { if (mTargetHdrSdrRatio == 1.0f) { if (isHdrEnabled()) { mPreviousRenderRatio = mTargetHdrSdrRatio; } else { float delta = mTargetHdrSdrRatio - mPreviousRenderRatio; float delta = mTargetHdrSdrRatio - mPreviousRenderRatio; if (delta > maxStep) { if (delta > maxStep) { mRenderHdrSdrRatio = mPreviousRenderRatio + maxStep; mRenderHdrSdrRatio = mPreviousRenderRatio + maxStep; Loading @@ -85,6 +85,19 @@ class HdrRenderState implements Consumer<Display> { mViewRoot.invalidate(); mViewRoot.invalidate(); } } mPreviousRenderRatio = mRenderHdrSdrRatio; mPreviousRenderRatio = mRenderHdrSdrRatio; if (mTargetDesiredHdrSdrRatio < mDesiredHdrSdrRatio) { mDesiredHdrSdrRatio = Math.max(mTargetDesiredHdrSdrRatio, mDesiredHdrSdrRatio - maxStep); if (mDesiredHdrSdrRatio != mTargetDesiredHdrSdrRatio) { mUpdateHdrSdrRatioInfo = true; mViewRoot.invalidate(); } } } else { mPreviousRenderRatio = mTargetHdrSdrRatio; mDesiredHdrSdrRatio = mTargetDesiredHdrSdrRatio; } } } } return hasUpdate; return hasUpdate; Loading @@ -99,15 +112,23 @@ class HdrRenderState implements Consumer<Display> { } } void forceUpdateHdrSdrRatio() { void forceUpdateHdrSdrRatio() { mTargetHdrSdrRatio = Math.min(mDesiredHdrSdrRatio, mViewRoot.mDisplay.getHdrSdrRatio()); if (isHdrEnabled()) { mTargetHdrSdrRatio = Math.min(mDesiredHdrSdrRatio, mViewRoot.mDisplay.getHdrSdrRatio()); } else { mTargetHdrSdrRatio = 1.0f; } mUpdateHdrSdrRatioInfo = true; mUpdateHdrSdrRatioInfo = true; } } void setDesiredHdrSdrRatio(float desiredRatio) { void setDesiredHdrSdrRatio(boolean isHdrEnabled, float desiredRatio) { mIsHdrEnabled = isHdrEnabled; mLastUpdateMillis = SystemClock.uptimeMillis(); mLastUpdateMillis = SystemClock.uptimeMillis(); // TODO: When decreasing the desired ratio we need to animate it downwards if (desiredRatio != mTargetDesiredHdrSdrRatio) { if (desiredRatio != mDesiredHdrSdrRatio) { mTargetDesiredHdrSdrRatio = desiredRatio; mDesiredHdrSdrRatio = desiredRatio; if (mTargetDesiredHdrSdrRatio > mDesiredHdrSdrRatio || !FLAG_ANIMATE_ENABLED) { mDesiredHdrSdrRatio = mTargetDesiredHdrSdrRatio; } forceUpdateHdrSdrRatio(); forceUpdateHdrSdrRatio(); mViewRoot.invalidate(); mViewRoot.invalidate(); Loading core/java/android/view/ViewRootImpl.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -5824,9 +5824,11 @@ public final class ViewRootImpl implements ViewParent, if (mAttachInfo.mThreadedRenderer == null) { if (mAttachInfo.mThreadedRenderer == null) { return; return; } } if ((colorMode == ActivityInfo.COLOR_MODE_HDR || colorMode == ActivityInfo.COLOR_MODE_HDR10) boolean isHdr = colorMode == ActivityInfo.COLOR_MODE_HDR && !mDisplay.isHdrSdrRatioAvailable()) { || colorMode == ActivityInfo.COLOR_MODE_HDR10; if (isHdr && !mDisplay.isHdrSdrRatioAvailable()) { colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; isHdr = false; } } // TODO: Centralize this sanitization? Why do we let setting bad modes? // TODO: Centralize this sanitization? Why do we let setting bad modes? // Alternatively, can we just let HWUI figure it out? Do we need to care here? // Alternatively, can we just let HWUI figure it out? Do we need to care here? Loading @@ -5839,7 +5841,7 @@ public final class ViewRootImpl implements ViewParent, desiredRatio = automaticRatio; desiredRatio = automaticRatio; } } mHdrRenderState.setDesiredHdrSdrRatio(desiredRatio); mHdrRenderState.setDesiredHdrSdrRatio(isHdr, desiredRatio); } } @Override @Override Loading Loading
core/java/android/view/HdrRenderState.java +30 −9 Original line number Original line Diff line number Diff line Loading @@ -31,9 +31,11 @@ class HdrRenderState implements Consumer<Display> { private final ViewRootImpl mViewRoot; private final ViewRootImpl mViewRoot; private boolean mIsHdrEnabled = false; private boolean mIsListenerRegistered = false; private boolean mIsListenerRegistered = false; private boolean mUpdateHdrSdrRatioInfo = false; private boolean mUpdateHdrSdrRatioInfo = false; private float mDesiredHdrSdrRatio = 1f; private float mDesiredHdrSdrRatio = 1f; private float mTargetDesiredHdrSdrRatio = 1f; private float mTargetHdrSdrRatio = 1f; private float mTargetHdrSdrRatio = 1f; private float mRenderHdrSdrRatio = 1f; private float mRenderHdrSdrRatio = 1f; private float mPreviousRenderRatio = 1f; private float mPreviousRenderRatio = 1f; Loading @@ -50,7 +52,7 @@ class HdrRenderState implements Consumer<Display> { } } boolean isHdrEnabled() { boolean isHdrEnabled() { return mDesiredHdrSdrRatio >= 1.01f; return mIsHdrEnabled; } } void stopListening() { void stopListening() { Loading @@ -75,9 +77,7 @@ class HdrRenderState implements Consumer<Display> { final float maxStep = timeDelta * TRANSITION_PER_MS; final float maxStep = timeDelta * TRANSITION_PER_MS; mLastUpdateMillis = frameTimeMillis; mLastUpdateMillis = frameTimeMillis; if (hasUpdate && FLAG_ANIMATE_ENABLED) { if (hasUpdate && FLAG_ANIMATE_ENABLED) { if (mTargetHdrSdrRatio == 1.0f) { if (isHdrEnabled()) { mPreviousRenderRatio = mTargetHdrSdrRatio; } else { float delta = mTargetHdrSdrRatio - mPreviousRenderRatio; float delta = mTargetHdrSdrRatio - mPreviousRenderRatio; if (delta > maxStep) { if (delta > maxStep) { mRenderHdrSdrRatio = mPreviousRenderRatio + maxStep; mRenderHdrSdrRatio = mPreviousRenderRatio + maxStep; Loading @@ -85,6 +85,19 @@ class HdrRenderState implements Consumer<Display> { mViewRoot.invalidate(); mViewRoot.invalidate(); } } mPreviousRenderRatio = mRenderHdrSdrRatio; mPreviousRenderRatio = mRenderHdrSdrRatio; if (mTargetDesiredHdrSdrRatio < mDesiredHdrSdrRatio) { mDesiredHdrSdrRatio = Math.max(mTargetDesiredHdrSdrRatio, mDesiredHdrSdrRatio - maxStep); if (mDesiredHdrSdrRatio != mTargetDesiredHdrSdrRatio) { mUpdateHdrSdrRatioInfo = true; mViewRoot.invalidate(); } } } else { mPreviousRenderRatio = mTargetHdrSdrRatio; mDesiredHdrSdrRatio = mTargetDesiredHdrSdrRatio; } } } } return hasUpdate; return hasUpdate; Loading @@ -99,15 +112,23 @@ class HdrRenderState implements Consumer<Display> { } } void forceUpdateHdrSdrRatio() { void forceUpdateHdrSdrRatio() { mTargetHdrSdrRatio = Math.min(mDesiredHdrSdrRatio, mViewRoot.mDisplay.getHdrSdrRatio()); if (isHdrEnabled()) { mTargetHdrSdrRatio = Math.min(mDesiredHdrSdrRatio, mViewRoot.mDisplay.getHdrSdrRatio()); } else { mTargetHdrSdrRatio = 1.0f; } mUpdateHdrSdrRatioInfo = true; mUpdateHdrSdrRatioInfo = true; } } void setDesiredHdrSdrRatio(float desiredRatio) { void setDesiredHdrSdrRatio(boolean isHdrEnabled, float desiredRatio) { mIsHdrEnabled = isHdrEnabled; mLastUpdateMillis = SystemClock.uptimeMillis(); mLastUpdateMillis = SystemClock.uptimeMillis(); // TODO: When decreasing the desired ratio we need to animate it downwards if (desiredRatio != mTargetDesiredHdrSdrRatio) { if (desiredRatio != mDesiredHdrSdrRatio) { mTargetDesiredHdrSdrRatio = desiredRatio; mDesiredHdrSdrRatio = desiredRatio; if (mTargetDesiredHdrSdrRatio > mDesiredHdrSdrRatio || !FLAG_ANIMATE_ENABLED) { mDesiredHdrSdrRatio = mTargetDesiredHdrSdrRatio; } forceUpdateHdrSdrRatio(); forceUpdateHdrSdrRatio(); mViewRoot.invalidate(); mViewRoot.invalidate(); Loading
core/java/android/view/ViewRootImpl.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -5824,9 +5824,11 @@ public final class ViewRootImpl implements ViewParent, if (mAttachInfo.mThreadedRenderer == null) { if (mAttachInfo.mThreadedRenderer == null) { return; return; } } if ((colorMode == ActivityInfo.COLOR_MODE_HDR || colorMode == ActivityInfo.COLOR_MODE_HDR10) boolean isHdr = colorMode == ActivityInfo.COLOR_MODE_HDR && !mDisplay.isHdrSdrRatioAvailable()) { || colorMode == ActivityInfo.COLOR_MODE_HDR10; if (isHdr && !mDisplay.isHdrSdrRatioAvailable()) { colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; colorMode = ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT; isHdr = false; } } // TODO: Centralize this sanitization? Why do we let setting bad modes? // TODO: Centralize this sanitization? Why do we let setting bad modes? // Alternatively, can we just let HWUI figure it out? Do we need to care here? // Alternatively, can we just let HWUI figure it out? Do we need to care here? Loading @@ -5839,7 +5841,7 @@ public final class ViewRootImpl implements ViewParent, desiredRatio = automaticRatio; desiredRatio = automaticRatio; } } mHdrRenderState.setDesiredHdrSdrRatio(desiredRatio); mHdrRenderState.setDesiredHdrSdrRatio(isHdr, desiredRatio); } } @Override @Override Loading