Loading tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt +11 −48 Original line number Diff line number Diff line Loading @@ -16,10 +16,6 @@ package com.android.test.silkfx.hdr import android.animation.AnimatorSet import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.animation.ValueAnimator.AnimatorUpdateListener import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas Loading @@ -46,7 +42,7 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context private var selectedImage = -1 private var outputMode = R.id.output_hdr private var bitmap: Bitmap? = null private var gainmap: Gainmap? = null private var originalGainmap: Gainmap? = null private var gainmapVisualizer: Bitmap? = null private lateinit var imageView: SubsamplingScaleImageView private lateinit var gainmapMetadataEditor: GainmapMetadataEditor Loading @@ -70,7 +66,6 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context it.check(outputMode) it.setOnCheckedChangeListener { _, checkedId -> outputMode = checkedId // Intentionally don't do anything fancy so that mode A/B comparisons are easy updateDisplay() } } Loading Loading @@ -101,41 +96,10 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context imageView.apply { isClickable = true // Example of animating between SDR and HDR using gainmap params; animates HDR->SDR->HDR // with a brief pause on SDR. The key thing here is that the gainmap's // minDisplayRatioForHdrTransition is animated between its original value (for full HDR) // and displayRatioForFullHdr (for full SDR). The view must also be invalidated during // the animation for the updates to take effect. setOnClickListener { if (gainmap != null && (outputMode == R.id.output_hdr || outputMode == R.id.output_hdr_test)) { val animationLengthMs: Long = 500 val updateListener = object : AnimatorUpdateListener { override fun onAnimationUpdate(animation: ValueAnimator) { imageView.invalidate() } } val hdrToSdr = ObjectAnimator.ofFloat( gainmap, "minDisplayRatioForHdrTransition", gainmap!!.minDisplayRatioForHdrTransition, gainmap!!.displayRatioForFullHdr).apply { duration = animationLengthMs addUpdateListener(updateListener) } val sdrToHdr = ObjectAnimator.ofFloat( gainmap, "minDisplayRatioForHdrTransition", gainmap!!.displayRatioForFullHdr, gainmap!!.minDisplayRatioForHdrTransition).apply { duration = animationLengthMs addUpdateListener(updateListener) } AnimatorSet().apply { play(hdrToSdr) play(sdrToHdr).after(animationLengthMs) start() } } animate().alpha(.5f).withEndAction { animate().alpha(1f).start() }.start() } } } Loading @@ -149,7 +113,7 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context } private fun doDecode(source: ImageDecoder.Source) { gainmap = null originalGainmap = null bitmap = ImageDecoder.decodeBitmap(source) { decoder, info, source -> decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE } Loading @@ -167,9 +131,10 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context findViewById<TextView>(R.id.error_msg)!!.visibility = View.GONE findViewById<RadioGroup>(R.id.output_mode)!!.visibility = View.VISIBLE gainmap = bitmap!!.gainmap gainmapMetadataEditor.setGainmap(gainmap) val map = gainmap!!.gainmapContents val gainmap = bitmap!!.gainmap!! originalGainmap = gainmap gainmapMetadataEditor.setGainmap(Gainmap(gainmap, gainmap.gainmapContents)) val map = gainmap.gainmapContents if (map.config != Bitmap.Config.ALPHA_8) { gainmapVisualizer = map } else { Loading Loading @@ -198,14 +163,12 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context imageView.setImage(ImageSource.cachedBitmap(when (outputMode) { R.id.output_hdr -> { gainmapMetadataEditor.useOriginalMetadata() bitmap!!.gainmap = gainmap bitmap!!.gainmap = originalGainmap bitmap!! } R.id.output_hdr_test -> { gainmapMetadataEditor.useEditMetadata() bitmap!!.gainmap = gainmap bitmap!!.gainmap = gainmapMetadataEditor.editedGainmap() bitmap!! } Loading tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt +67 −82 Original line number Diff line number Diff line Loading @@ -37,9 +37,13 @@ data class GainmapMetadata( var offsetHdr: Float ) /** * Note: This can only handle single-channel gainmaps nicely. It will force all 3-channel * metadata to have the same value single value and is not intended to be a robust demonstration * of gainmap metadata editing */ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private var gainmap: Gainmap? = null private var showingEdits = false private lateinit var gainmap: Gainmap private var metadataPopup: PopupWindow? = null Loading @@ -61,23 +65,18 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private val maxGamma = 3.0f // Min and max offsets are 0.0 and 1.0 respectively fun setGainmap(newGainmap: Gainmap?) { fun setGainmap(newGainmap: Gainmap) { gainmap = newGainmap originalMetadata = GainmapMetadata(gainmap!!.getRatioMin()[0], gainmap!!.getRatioMax()[0], gainmap!!.getMinDisplayRatioForHdrTransition(), gainmap!!.getDisplayRatioForFullHdr(), gainmap!!.getGamma()[0], gainmap!!.getEpsilonSdr()[0], gainmap!!.getEpsilonHdr()[0]) originalMetadata = GainmapMetadata(gainmap.getRatioMin()[0], gainmap.getRatioMax()[0], gainmap.getMinDisplayRatioForHdrTransition(), gainmap.getDisplayRatioForFullHdr(), gainmap.getGamma()[0], gainmap.getEpsilonSdr()[0], gainmap.getEpsilonHdr()[0]) currentMetadata = originalMetadata.copy() } fun useOriginalMetadata() { showingEdits = false applyMetadata(originalMetadata) } fun useEditMetadata() { showingEdits = true fun editedGainmap(): Gainmap { applyMetadata(currentMetadata) return gainmap } fun closeEditor() { Loading Loading @@ -189,13 +188,13 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { } private fun applyMetadata(newMetadata: GainmapMetadata) { gainmap!!.setRatioMin(newMetadata.ratioMin, newMetadata.ratioMin, newMetadata.ratioMin) gainmap!!.setRatioMax(newMetadata.ratioMax, newMetadata.ratioMax, newMetadata.ratioMax) gainmap!!.setMinDisplayRatioForHdrTransition(newMetadata.capacityMin) gainmap!!.setDisplayRatioForFullHdr(newMetadata.capacityMax) gainmap!!.setGamma(newMetadata.gamma, newMetadata.gamma, newMetadata.gamma) gainmap!!.setEpsilonSdr(newMetadata.offsetSdr, newMetadata.offsetSdr, newMetadata.offsetSdr) gainmap!!.setEpsilonHdr(newMetadata.offsetHdr, newMetadata.offsetHdr, newMetadata.offsetHdr) gainmap.setRatioMin(newMetadata.ratioMin, newMetadata.ratioMin, newMetadata.ratioMin) gainmap.setRatioMax(newMetadata.ratioMax, newMetadata.ratioMax, newMetadata.ratioMax) gainmap.setMinDisplayRatioForHdrTransition(newMetadata.capacityMin) gainmap.setDisplayRatioForFullHdr(newMetadata.capacityMax) gainmap.setGamma(newMetadata.gamma, newMetadata.gamma, newMetadata.gamma) gainmap.setEpsilonSdr(newMetadata.offsetSdr, newMetadata.offsetSdr, newMetadata.offsetSdr) gainmap.setEpsilonHdr(newMetadata.offsetHdr, newMetadata.offsetHdr, newMetadata.offsetHdr) renderView.invalidate() } Loading @@ -204,55 +203,45 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val)!!.setText( "%.3f".format(newValue)) currentMetadata.ratioMin = newValue if (showingEdits) { gainmap!!.setRatioMin(newValue, newValue, newValue) gainmap.setRatioMin(newValue, newValue, newValue) renderView.invalidate() } } private fun updateGainmapMax(normalized: Float) { val newValue = minRatioMax + normalized * (maxRatioMax - minRatioMax) parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val)!!.setText( "%.3f".format(newValue)) currentMetadata.ratioMax = newValue if (showingEdits) { gainmap!!.setRatioMax(newValue, newValue, newValue) gainmap.setRatioMax(newValue, newValue, newValue) renderView.invalidate() } } private fun updateCapacityMin(normalized: Float) { val newValue = minCapacityMin + normalized * (maxCapacityMin - minCapacityMin) parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymin_val)!!.setText( "%.3f".format(newValue)) currentMetadata.capacityMin = newValue if (showingEdits) { gainmap!!.setMinDisplayRatioForHdrTransition(newValue) gainmap.setMinDisplayRatioForHdrTransition(newValue) renderView.invalidate() } } private fun updateCapacityMax(normalized: Float) { val newValue = minCapacityMax + normalized * (maxCapacityMax - minCapacityMax) parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymax_val)!!.setText( "%.3f".format(newValue)) currentMetadata.capacityMax = newValue if (showingEdits) { gainmap!!.setDisplayRatioForFullHdr(newValue) gainmap.setDisplayRatioForFullHdr(newValue) renderView.invalidate() } } private fun updateGamma(normalized: Float) { val newValue = minGamma + normalized * (maxGamma - minGamma) parent.findViewById<TextView>(R.id.gainmap_metadata_gamma_val)!!.setText( "%.3f".format(newValue)) currentMetadata.gamma = newValue if (showingEdits) { gainmap!!.setGamma(newValue, newValue, newValue) gainmap.setGamma(newValue, newValue, newValue) renderView.invalidate() } } private fun updateOffsetSdr(normalized: Float) { var newValue = 0.0f Loading @@ -262,11 +251,9 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val)!!.setText( "%.5f".format(newValue)) currentMetadata.offsetSdr = newValue if (showingEdits) { gainmap!!.setEpsilonSdr(newValue, newValue, newValue) gainmap.setEpsilonSdr(newValue, newValue, newValue) renderView.invalidate() } } private fun updateOffsetHdr(normalized: Float) { var newValue = 0.0f Loading @@ -276,9 +263,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_offsethdr_val)!!.setText( "%.5f".format(newValue)) currentMetadata.offsetHdr = newValue if (showingEdits) { gainmap!!.setEpsilonHdr(newValue, newValue, newValue) gainmap.setEpsilonHdr(newValue, newValue, newValue) renderView.invalidate() } } } Loading
tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt +11 −48 Original line number Diff line number Diff line Loading @@ -16,10 +16,6 @@ package com.android.test.silkfx.hdr import android.animation.AnimatorSet import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.animation.ValueAnimator.AnimatorUpdateListener import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas Loading @@ -46,7 +42,7 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context private var selectedImage = -1 private var outputMode = R.id.output_hdr private var bitmap: Bitmap? = null private var gainmap: Gainmap? = null private var originalGainmap: Gainmap? = null private var gainmapVisualizer: Bitmap? = null private lateinit var imageView: SubsamplingScaleImageView private lateinit var gainmapMetadataEditor: GainmapMetadataEditor Loading @@ -70,7 +66,6 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context it.check(outputMode) it.setOnCheckedChangeListener { _, checkedId -> outputMode = checkedId // Intentionally don't do anything fancy so that mode A/B comparisons are easy updateDisplay() } } Loading Loading @@ -101,41 +96,10 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context imageView.apply { isClickable = true // Example of animating between SDR and HDR using gainmap params; animates HDR->SDR->HDR // with a brief pause on SDR. The key thing here is that the gainmap's // minDisplayRatioForHdrTransition is animated between its original value (for full HDR) // and displayRatioForFullHdr (for full SDR). The view must also be invalidated during // the animation for the updates to take effect. setOnClickListener { if (gainmap != null && (outputMode == R.id.output_hdr || outputMode == R.id.output_hdr_test)) { val animationLengthMs: Long = 500 val updateListener = object : AnimatorUpdateListener { override fun onAnimationUpdate(animation: ValueAnimator) { imageView.invalidate() } } val hdrToSdr = ObjectAnimator.ofFloat( gainmap, "minDisplayRatioForHdrTransition", gainmap!!.minDisplayRatioForHdrTransition, gainmap!!.displayRatioForFullHdr).apply { duration = animationLengthMs addUpdateListener(updateListener) } val sdrToHdr = ObjectAnimator.ofFloat( gainmap, "minDisplayRatioForHdrTransition", gainmap!!.displayRatioForFullHdr, gainmap!!.minDisplayRatioForHdrTransition).apply { duration = animationLengthMs addUpdateListener(updateListener) } AnimatorSet().apply { play(hdrToSdr) play(sdrToHdr).after(animationLengthMs) start() } } animate().alpha(.5f).withEndAction { animate().alpha(1f).start() }.start() } } } Loading @@ -149,7 +113,7 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context } private fun doDecode(source: ImageDecoder.Source) { gainmap = null originalGainmap = null bitmap = ImageDecoder.decodeBitmap(source) { decoder, info, source -> decoder.allocator = ImageDecoder.ALLOCATOR_SOFTWARE } Loading @@ -167,9 +131,10 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context findViewById<TextView>(R.id.error_msg)!!.visibility = View.GONE findViewById<RadioGroup>(R.id.output_mode)!!.visibility = View.VISIBLE gainmap = bitmap!!.gainmap gainmapMetadataEditor.setGainmap(gainmap) val map = gainmap!!.gainmapContents val gainmap = bitmap!!.gainmap!! originalGainmap = gainmap gainmapMetadataEditor.setGainmap(Gainmap(gainmap, gainmap.gainmapContents)) val map = gainmap.gainmapContents if (map.config != Bitmap.Config.ALPHA_8) { gainmapVisualizer = map } else { Loading Loading @@ -198,14 +163,12 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context imageView.setImage(ImageSource.cachedBitmap(when (outputMode) { R.id.output_hdr -> { gainmapMetadataEditor.useOriginalMetadata() bitmap!!.gainmap = gainmap bitmap!!.gainmap = originalGainmap bitmap!! } R.id.output_hdr_test -> { gainmapMetadataEditor.useEditMetadata() bitmap!!.gainmap = gainmap bitmap!!.gainmap = gainmapMetadataEditor.editedGainmap() bitmap!! } Loading
tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt +67 −82 Original line number Diff line number Diff line Loading @@ -37,9 +37,13 @@ data class GainmapMetadata( var offsetHdr: Float ) /** * Note: This can only handle single-channel gainmaps nicely. It will force all 3-channel * metadata to have the same value single value and is not intended to be a robust demonstration * of gainmap metadata editing */ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private var gainmap: Gainmap? = null private var showingEdits = false private lateinit var gainmap: Gainmap private var metadataPopup: PopupWindow? = null Loading @@ -61,23 +65,18 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private val maxGamma = 3.0f // Min and max offsets are 0.0 and 1.0 respectively fun setGainmap(newGainmap: Gainmap?) { fun setGainmap(newGainmap: Gainmap) { gainmap = newGainmap originalMetadata = GainmapMetadata(gainmap!!.getRatioMin()[0], gainmap!!.getRatioMax()[0], gainmap!!.getMinDisplayRatioForHdrTransition(), gainmap!!.getDisplayRatioForFullHdr(), gainmap!!.getGamma()[0], gainmap!!.getEpsilonSdr()[0], gainmap!!.getEpsilonHdr()[0]) originalMetadata = GainmapMetadata(gainmap.getRatioMin()[0], gainmap.getRatioMax()[0], gainmap.getMinDisplayRatioForHdrTransition(), gainmap.getDisplayRatioForFullHdr(), gainmap.getGamma()[0], gainmap.getEpsilonSdr()[0], gainmap.getEpsilonHdr()[0]) currentMetadata = originalMetadata.copy() } fun useOriginalMetadata() { showingEdits = false applyMetadata(originalMetadata) } fun useEditMetadata() { showingEdits = true fun editedGainmap(): Gainmap { applyMetadata(currentMetadata) return gainmap } fun closeEditor() { Loading Loading @@ -189,13 +188,13 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { } private fun applyMetadata(newMetadata: GainmapMetadata) { gainmap!!.setRatioMin(newMetadata.ratioMin, newMetadata.ratioMin, newMetadata.ratioMin) gainmap!!.setRatioMax(newMetadata.ratioMax, newMetadata.ratioMax, newMetadata.ratioMax) gainmap!!.setMinDisplayRatioForHdrTransition(newMetadata.capacityMin) gainmap!!.setDisplayRatioForFullHdr(newMetadata.capacityMax) gainmap!!.setGamma(newMetadata.gamma, newMetadata.gamma, newMetadata.gamma) gainmap!!.setEpsilonSdr(newMetadata.offsetSdr, newMetadata.offsetSdr, newMetadata.offsetSdr) gainmap!!.setEpsilonHdr(newMetadata.offsetHdr, newMetadata.offsetHdr, newMetadata.offsetHdr) gainmap.setRatioMin(newMetadata.ratioMin, newMetadata.ratioMin, newMetadata.ratioMin) gainmap.setRatioMax(newMetadata.ratioMax, newMetadata.ratioMax, newMetadata.ratioMax) gainmap.setMinDisplayRatioForHdrTransition(newMetadata.capacityMin) gainmap.setDisplayRatioForFullHdr(newMetadata.capacityMax) gainmap.setGamma(newMetadata.gamma, newMetadata.gamma, newMetadata.gamma) gainmap.setEpsilonSdr(newMetadata.offsetSdr, newMetadata.offsetSdr, newMetadata.offsetSdr) gainmap.setEpsilonHdr(newMetadata.offsetHdr, newMetadata.offsetHdr, newMetadata.offsetHdr) renderView.invalidate() } Loading @@ -204,55 +203,45 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val)!!.setText( "%.3f".format(newValue)) currentMetadata.ratioMin = newValue if (showingEdits) { gainmap!!.setRatioMin(newValue, newValue, newValue) gainmap.setRatioMin(newValue, newValue, newValue) renderView.invalidate() } } private fun updateGainmapMax(normalized: Float) { val newValue = minRatioMax + normalized * (maxRatioMax - minRatioMax) parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val)!!.setText( "%.3f".format(newValue)) currentMetadata.ratioMax = newValue if (showingEdits) { gainmap!!.setRatioMax(newValue, newValue, newValue) gainmap.setRatioMax(newValue, newValue, newValue) renderView.invalidate() } } private fun updateCapacityMin(normalized: Float) { val newValue = minCapacityMin + normalized * (maxCapacityMin - minCapacityMin) parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymin_val)!!.setText( "%.3f".format(newValue)) currentMetadata.capacityMin = newValue if (showingEdits) { gainmap!!.setMinDisplayRatioForHdrTransition(newValue) gainmap.setMinDisplayRatioForHdrTransition(newValue) renderView.invalidate() } } private fun updateCapacityMax(normalized: Float) { val newValue = minCapacityMax + normalized * (maxCapacityMax - minCapacityMax) parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymax_val)!!.setText( "%.3f".format(newValue)) currentMetadata.capacityMax = newValue if (showingEdits) { gainmap!!.setDisplayRatioForFullHdr(newValue) gainmap.setDisplayRatioForFullHdr(newValue) renderView.invalidate() } } private fun updateGamma(normalized: Float) { val newValue = minGamma + normalized * (maxGamma - minGamma) parent.findViewById<TextView>(R.id.gainmap_metadata_gamma_val)!!.setText( "%.3f".format(newValue)) currentMetadata.gamma = newValue if (showingEdits) { gainmap!!.setGamma(newValue, newValue, newValue) gainmap.setGamma(newValue, newValue, newValue) renderView.invalidate() } } private fun updateOffsetSdr(normalized: Float) { var newValue = 0.0f Loading @@ -262,11 +251,9 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val)!!.setText( "%.5f".format(newValue)) currentMetadata.offsetSdr = newValue if (showingEdits) { gainmap!!.setEpsilonSdr(newValue, newValue, newValue) gainmap.setEpsilonSdr(newValue, newValue, newValue) renderView.invalidate() } } private fun updateOffsetHdr(normalized: Float) { var newValue = 0.0f Loading @@ -276,9 +263,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { parent.findViewById<TextView>(R.id.gainmap_metadata_offsethdr_val)!!.setText( "%.5f".format(newValue)) currentMetadata.offsetHdr = newValue if (showingEdits) { gainmap!!.setEpsilonHdr(newValue, newValue, newValue) gainmap.setEpsilonHdr(newValue, newValue, newValue) renderView.invalidate() } } }