diff options
author | Derek Sollenberger <djsollen@google.com> | 2018-04-20 16:13:31 -0400 |
---|---|---|
committer | Derek Sollenberger <djsollen@google.com> | 2018-05-01 02:45:43 +0000 |
commit | 551d08e2d50c7f73c5eb65fd366b92efba4f0ed5 (patch) | |
tree | 9ac55bbd3f8a5886fb611d35c79627fc3c2031db /libs/hwui/utils | |
parent | 9ea13ca0b67e77c5efda1c94c141dc49987c0745 (diff) |
Respect a Layer's (e.g. SurfaceTexture) colorSpace when compositing
This CL extracts the android_dataspace from the GLConsumer and converts
it to a SkColorSpace. HWUI always expects to composite into an sRGB
destination so when we draw the layer we run the draw through a
colorFilter that converts the input colorSpace into that of the
destination.
Test: CtsViewTestCases
Bug: 78016220
Merged-In: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Change-Id: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Diffstat (limited to 'libs/hwui/utils')
-rw-r--r-- | libs/hwui/utils/Color.cpp | 54 | ||||
-rw-r--r-- | libs/hwui/utils/Color.h | 3 |
2 files changed, 57 insertions, 0 deletions
diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index c2af867657bf..75740e8b5baf 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -16,6 +16,8 @@ #include "Color.h" + +#include <utils/Log.h> #include <cmath> namespace android { @@ -53,5 +55,57 @@ bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace) { return false; } +sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace) { + + SkColorSpace::Gamut gamut; + switch (dataspace & HAL_DATASPACE_STANDARD_MASK) { + case HAL_DATASPACE_STANDARD_BT709: + gamut = SkColorSpace::kSRGB_Gamut; + break; + case HAL_DATASPACE_STANDARD_BT2020: + gamut = SkColorSpace::kRec2020_Gamut; + break; + case HAL_DATASPACE_STANDARD_DCI_P3: + gamut = SkColorSpace::kDCIP3_D65_Gamut; + break; + case HAL_DATASPACE_STANDARD_ADOBE_RGB: + gamut = SkColorSpace::kAdobeRGB_Gamut; + break; + case HAL_DATASPACE_STANDARD_UNSPECIFIED: + return nullptr; + case HAL_DATASPACE_STANDARD_BT601_625: + case HAL_DATASPACE_STANDARD_BT601_625_UNADJUSTED: + case HAL_DATASPACE_STANDARD_BT601_525: + case HAL_DATASPACE_STANDARD_BT601_525_UNADJUSTED: + case HAL_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE: + case HAL_DATASPACE_STANDARD_BT470M: + case HAL_DATASPACE_STANDARD_FILM: + default: + ALOGW("Unsupported Gamut: %d", dataspace); + return nullptr; + } + + switch (dataspace & HAL_DATASPACE_TRANSFER_MASK) { + case HAL_DATASPACE_TRANSFER_LINEAR: + return SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, gamut); + case HAL_DATASPACE_TRANSFER_SRGB: + return SkColorSpace::MakeRGB(SkColorSpace::kSRGB_RenderTargetGamma, gamut); + case HAL_DATASPACE_TRANSFER_GAMMA2_2: + return SkColorSpace::MakeRGB({2.2f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut); + case HAL_DATASPACE_TRANSFER_GAMMA2_6: + return SkColorSpace::MakeRGB({2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut); + case HAL_DATASPACE_TRANSFER_GAMMA2_8: + return SkColorSpace::MakeRGB({2.8f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, gamut); + case HAL_DATASPACE_TRANSFER_UNSPECIFIED: + return nullptr; + case HAL_DATASPACE_TRANSFER_SMPTE_170M: + case HAL_DATASPACE_TRANSFER_ST2084: + case HAL_DATASPACE_TRANSFER_HLG: + default: + ALOGW("Unsupported Gamma: %d", dataspace); + return nullptr; + } +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h index 7ac0d963732f..2bec1f5f7852 100644 --- a/libs/hwui/utils/Color.h +++ b/libs/hwui/utils/Color.h @@ -17,6 +17,7 @@ #define COLOR_H #include <math.h> +#include <system/graphics.h> #include <SkColor.h> #include <SkColorSpace.h> @@ -111,6 +112,8 @@ static constexpr float EOCF(float srgb) { // approximated with the native sRGB transfer function. This method // returns true for sRGB, gamma 2.2 and Display P3 for instance bool transferFunctionCloseToSRGB(const SkColorSpace* colorSpace); + +sk_sp<SkColorSpace> DataSpaceToColorSpace(android_dataspace dataspace); } /* namespace uirenderer */ } /* namespace android */ |