diff options
author | 2023-07-31 20:19:38 +0000 | |
---|---|---|
committer | 2023-08-04 14:56:57 +0000 | |
commit | 5ba978380fbb403cdc908d9dc3a30a2b11474e06 (patch) | |
tree | 7db7800954e0052ade0a4b7b83a4189a30d5f25f | |
parent | 78add9067092e01b3ad0be0ba3a4d25a176ab2b8 (diff) |
Support TextureView/ImageView HDR for COLOR_MODE_HDR
Bug: 284006942
Test: HwAccelerationTest
Change-Id: I040f3090c2eca8b89ba1db70ef5cbfae02dcb33b
-rw-r--r-- | libs/hwui/Tonemapper.cpp | 12 | ||||
-rw-r--r-- | tests/HwAccelerationTest/src/com/android/test/hwui/ColorBitmapActivity.java | 38 |
2 files changed, 49 insertions, 1 deletions
diff --git a/libs/hwui/Tonemapper.cpp b/libs/hwui/Tonemapper.cpp index 974a5d05aa84..ae29edf535a2 100644 --- a/libs/hwui/Tonemapper.cpp +++ b/libs/hwui/Tonemapper.cpp @@ -20,6 +20,7 @@ #include <log/log.h> // libshaders only exists on Android devices #ifdef __ANDROID__ +#include <renderthread/CanvasContext.h> #include <shaders/shaders.h> #endif @@ -53,8 +54,17 @@ static sk_sp<SkColorFilter> createLinearEffectColorFilter(const shaders::LinearE ColorFilterRuntimeEffectBuilder effectBuilder(std::move(runtimeEffect)); + auto colorTransform = android::mat4(); + const auto* context = renderthread::CanvasContext::getActiveContext(); + if (context) { + const auto ratio = context->targetSdrHdrRatio(); + if (ratio > 1.0f) { + colorTransform = android::mat4::scale(vec4(ratio, ratio, ratio, 1.f)); + } + } + const auto uniforms = - shaders::buildLinearEffectUniforms(linearEffect, android::mat4(), maxDisplayLuminance, + shaders::buildLinearEffectUniforms(linearEffect, colorTransform, maxDisplayLuminance, currentDisplayLuminanceNits, maxLuminance); for (const auto& uniform : uniforms) { diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorBitmapActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorBitmapActivity.java index e2d17cdbe9e6..1f4c6c53b260 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorBitmapActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorBitmapActivity.java @@ -17,6 +17,7 @@ package com.android.test.hwui; import android.app.Activity; +import android.content.pm.ActivityInfo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorSpace; @@ -72,6 +73,10 @@ public class ColorBitmapActivity extends Activity implements SurfaceHolder.Callb private int[] mGradientEndColors = {0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF}; private String[] mGradientColorNames = {"Grayscale", "Red", "Green", "Blue"}; + private int mColorMode = ActivityInfo.COLOR_MODE_DEFAULT; + private int[] mColorModes = {ActivityInfo.COLOR_MODE_DEFAULT, ActivityInfo.COLOR_MODE_HDR}; + private String[] mColorModeNames = {"DEFAULT", "HDR"}; + private final ExecutorService mBufferFenceExecutor = Executors.newFixedThreadPool(1); private final ExecutorService mBufferExecutor = Executors.newFixedThreadPool(1); @@ -139,6 +144,15 @@ public class ColorBitmapActivity extends Activity implements SurfaceHolder.Callb gradientColorSpinner .setOnItemSelectedListener(new GradientColorOnItemSelectedListener()); + ArrayAdapter<String> colorModeAdapter = new ArrayAdapter<>( + this, android.R.layout.simple_spinner_item, mColorModeNames); + + colorModeAdapter + .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + Spinner colorModeSpinner = new Spinner(this); + colorModeSpinner.setAdapter(colorModeAdapter); + colorModeSpinner.setOnItemSelectedListener(new ColorModeOnItemSelectedListener()); + mGradientBuffer = getGradientBuffer().get(); LinearLayout linearLayout = new LinearLayout(this); @@ -169,6 +183,10 @@ public class ColorBitmapActivity extends Activity implements SurfaceHolder.Callb LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); + spinnerLayout.addView(colorModeSpinner, new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT)); + linearLayout.addView(spinnerLayout, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); @@ -187,6 +205,8 @@ public class ColorBitmapActivity extends Activity implements SurfaceHolder.Callb linearLayout.addView(mSurfaceView, new LinearLayout.LayoutParams(WIDTH, HEIGHT)); setContentView(linearLayout); + + getWindow().setColorMode(mColorMode); } catch (Exception e) { throw new RuntimeException(e); } @@ -312,4 +332,22 @@ public class ColorBitmapActivity extends Activity implements SurfaceHolder.Callb } } + + private final class ColorModeOnItemSelectedListener + implements AdapterView.OnItemSelectedListener { + + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + ColorBitmapActivity.this.mColorMode = ColorBitmapActivity.this.mColorModes[position]; + ColorBitmapActivity.this.getMainExecutor() + .execute(() -> { + ColorBitmapActivity.this.getWindow().setColorMode(mColorMode); + }); + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + + } + } } |