summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/renderengine/skia/SkiaRenderEngine.cpp3
-rw-r--r--libs/renderengine/skia/filters/LutShader.cpp29
-rw-r--r--libs/renderengine/skia/filters/LutShader.h4
3 files changed, 14 insertions, 22 deletions
diff --git a/libs/renderengine/skia/SkiaRenderEngine.cpp b/libs/renderengine/skia/SkiaRenderEngine.cpp
index 5c46c9168d..a93f6c36ff 100644
--- a/libs/renderengine/skia/SkiaRenderEngine.cpp
+++ b/libs/renderengine/skia/SkiaRenderEngine.cpp
@@ -544,7 +544,8 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader(
}
if (graphicBuffer && parameters.layer.luts) {
- shader = mLutShader.lutShader(shader, parameters.layer.luts);
+ shader = mLutShader.lutShader(shader, parameters.layer.luts,
+ toSkColorSpace(parameters.outputDataSpace));
}
if (parameters.requiresLinearEffect) {
diff --git a/libs/renderengine/skia/filters/LutShader.cpp b/libs/renderengine/skia/filters/LutShader.cpp
index cea46ef40e..1e43ff3cd3 100644
--- a/libs/renderengine/skia/filters/LutShader.cpp
+++ b/libs/renderengine/skia/filters/LutShader.cpp
@@ -169,7 +169,8 @@ sk_sp<SkShader> LutShader::generateLutShader(sk_sp<SkShader> input,
}
sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
- std::shared_ptr<gui::DisplayLuts> displayLuts) {
+ std::shared_ptr<gui::DisplayLuts> displayLuts,
+ sk_sp<SkColorSpace> outColorSpace) {
if (mBuilder == nullptr) {
const static SkRuntimeEffect::Result instance = SkRuntimeEffect::MakeForShader(kShader);
mBuilder = std::make_unique<SkRuntimeShaderBuilder>(instance.effect);
@@ -179,14 +180,11 @@ sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
if (fd.ok()) {
// de-gamma the image without changing the primaries
SkImage* baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
- if (baseImage) {
- sk_sp<SkColorSpace> baseColorSpace =
- baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
- sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
- auto colorXformSdrToGainmap =
- SkColorFilterPriv::MakeColorSpaceXform(baseColorSpace, gainmapMathColorSpace);
- input = input->makeWithColorFilter(colorXformSdrToGainmap);
- }
+ sk_sp<SkColorSpace> baseColorSpace = baseImage && baseImage->colorSpace()
+ ? baseImage->refColorSpace()
+ : SkColorSpace::MakeSRGB();
+ sk_sp<SkColorSpace> lutMathColorSpace = baseColorSpace->makeLinearGamma();
+ input = input->makeWithWorkingColorSpace(lutMathColorSpace);
auto& offsets = displayLuts->offsets;
auto& lutProperties = displayLuts->lutProperties;
@@ -223,16 +221,9 @@ sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
lutProperties[i].samplingKey);
}
- // re-gamma
- baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
- if (baseImage) {
- sk_sp<SkColorSpace> baseColorSpace =
- baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
- sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
- auto colorXformGainmapToDst =
- SkColorFilterPriv::MakeColorSpaceXform(gainmapMathColorSpace, baseColorSpace);
- input = input->makeWithColorFilter(colorXformGainmapToDst);
- }
+ auto colorXformLutToDst =
+ SkColorFilterPriv::MakeColorSpaceXform(lutMathColorSpace, outColorSpace);
+ input = input->makeWithColorFilter(colorXformLutToDst);
}
return input;
}
diff --git a/libs/renderengine/skia/filters/LutShader.h b/libs/renderengine/skia/filters/LutShader.h
index c157904b63..ce3e0592a1 100644
--- a/libs/renderengine/skia/filters/LutShader.h
+++ b/libs/renderengine/skia/filters/LutShader.h
@@ -28,8 +28,8 @@ namespace skia {
class LutShader {
public:
- sk_sp<SkShader> lutShader(sk_sp<SkShader>& input,
- std::shared_ptr<gui::DisplayLuts> displayLuts);
+ sk_sp<SkShader> lutShader(sk_sp<SkShader>& input, std::shared_ptr<gui::DisplayLuts> displayLuts,
+ sk_sp<SkColorSpace> outColorSpace);
private:
sk_sp<SkShader> generateLutShader(sk_sp<SkShader> input, const std::vector<float>& buffers,