Skip to content

Commit a6001c2

Browse files
Sally QiAndroid (Google) Code Review
authored andcommitted
Merge "[Lut shader] Fix gamma correction" into main
2 parents 2a8a1ae + b658b15 commit a6001c2

3 files changed

Lines changed: 14 additions & 22 deletions

File tree

libs/renderengine/skia/SkiaRenderEngine.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,8 @@ sk_sp<SkShader> SkiaRenderEngine::createRuntimeEffectShader(
544544
}
545545

546546
if (graphicBuffer && parameters.layer.luts) {
547-
shader = mLutShader.lutShader(shader, parameters.layer.luts);
547+
shader = mLutShader.lutShader(shader, parameters.layer.luts,
548+
toSkColorSpace(parameters.outputDataSpace));
548549
}
549550

550551
if (parameters.requiresLinearEffect) {

libs/renderengine/skia/filters/LutShader.cpp

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ sk_sp<SkShader> LutShader::generateLutShader(sk_sp<SkShader> input,
169169
}
170170

171171
sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
172-
std::shared_ptr<gui::DisplayLuts> displayLuts) {
172+
std::shared_ptr<gui::DisplayLuts> displayLuts,
173+
sk_sp<SkColorSpace> outColorSpace) {
173174
if (mBuilder == nullptr) {
174175
const static SkRuntimeEffect::Result instance = SkRuntimeEffect::MakeForShader(kShader);
175176
mBuilder = std::make_unique<SkRuntimeShaderBuilder>(instance.effect);
@@ -179,14 +180,11 @@ sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
179180
if (fd.ok()) {
180181
// de-gamma the image without changing the primaries
181182
SkImage* baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
182-
if (baseImage) {
183-
sk_sp<SkColorSpace> baseColorSpace =
184-
baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
185-
sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
186-
auto colorXformSdrToGainmap =
187-
SkColorFilterPriv::MakeColorSpaceXform(baseColorSpace, gainmapMathColorSpace);
188-
input = input->makeWithColorFilter(colorXformSdrToGainmap);
189-
}
183+
sk_sp<SkColorSpace> baseColorSpace = baseImage && baseImage->colorSpace()
184+
? baseImage->refColorSpace()
185+
: SkColorSpace::MakeSRGB();
186+
sk_sp<SkColorSpace> lutMathColorSpace = baseColorSpace->makeLinearGamma();
187+
input = input->makeWithWorkingColorSpace(lutMathColorSpace);
190188

191189
auto& offsets = displayLuts->offsets;
192190
auto& lutProperties = displayLuts->lutProperties;
@@ -223,16 +221,9 @@ sk_sp<SkShader> LutShader::lutShader(sk_sp<SkShader>& input,
223221
lutProperties[i].samplingKey);
224222
}
225223

226-
// re-gamma
227-
baseImage = input->isAImage((SkMatrix*)nullptr, (SkTileMode*)nullptr);
228-
if (baseImage) {
229-
sk_sp<SkColorSpace> baseColorSpace =
230-
baseImage->colorSpace() ? baseImage->refColorSpace() : SkColorSpace::MakeSRGB();
231-
sk_sp<SkColorSpace> gainmapMathColorSpace = baseColorSpace->makeLinearGamma();
232-
auto colorXformGainmapToDst =
233-
SkColorFilterPriv::MakeColorSpaceXform(gainmapMathColorSpace, baseColorSpace);
234-
input = input->makeWithColorFilter(colorXformGainmapToDst);
235-
}
224+
auto colorXformLutToDst =
225+
SkColorFilterPriv::MakeColorSpaceXform(lutMathColorSpace, outColorSpace);
226+
input = input->makeWithColorFilter(colorXformLutToDst);
236227
}
237228
return input;
238229
}

libs/renderengine/skia/filters/LutShader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ namespace skia {
2828

2929
class LutShader {
3030
public:
31-
sk_sp<SkShader> lutShader(sk_sp<SkShader>& input,
32-
std::shared_ptr<gui::DisplayLuts> displayLuts);
31+
sk_sp<SkShader> lutShader(sk_sp<SkShader>& input, std::shared_ptr<gui::DisplayLuts> displayLuts,
32+
sk_sp<SkColorSpace> outColorSpace);
3333

3434
private:
3535
sk_sp<SkShader> generateLutShader(sk_sp<SkShader> input, const std::vector<float>& buffers,

0 commit comments

Comments
 (0)