diff options
| -rw-r--r-- | libs/renderengine/skia/SkiaRenderEngine.cpp | 3 | ||||
| -rw-r--r-- | libs/renderengine/skia/filters/LutShader.cpp | 29 | ||||
| -rw-r--r-- | libs/renderengine/skia/filters/LutShader.h | 4 |
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, |