Commit ed480969 authored by Fredrik Hubinette's avatar Fredrik Hubinette Committed by Commit Bot

Color: handle pre-multiplied alpha correctly

Without this change, we're doing color transforms on
the multiplied-in alpha values, which is wrong.

Bug: 835322
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I30a9533837f8d6392394eab9d859968cec93e4da
Reviewed-on: https://chromium-review.googlesource.com/1036618Reviewed-by: default avatarFredrik Hubinette <hubbe@chromium.org>
Reviewed-by: default avatarccameron <ccameron@chromium.org>
Commit-Queue: Fredrik Hubinette <hubbe@chromium.org>
Cr-Commit-Position: refs/heads/master@{#555226}
parent f31ae6cb
......@@ -3997,10 +3997,11 @@ TEST_P(ColorTransformPixelTest, Basic) {
color.set_y(input_colors[4 * i + 1] / 255.f);
color.set_z(input_colors[4 * i + 2] / 255.f);
float alpha = input_colors[4 * i + 3] / 255.f;
if (!premultiplied_alpha_) {
color.Scale(alpha);
if (premultiplied_alpha_ && alpha > 0.0) {
color.Scale(1.0f / alpha);
}
transform->Transform(&color, 1);
color.Scale(alpha);
color.set_x(std::min(std::max(0.f, color.x()), 1.f));
color.set_y(std::min(std::max(0.f, color.y()), 1.f));
color.set_z(std::min(std::max(0.f, color.z()), 1.f));
......
......@@ -938,12 +938,6 @@ std::string FragmentShader::GetShaderSource() const {
break;
}
// Premultiply by alpha.
if (premultiply_alpha_mode_ == NON_PREMULTIPLIED_ALPHA) {
SRC("// Premultiply alpha");
SRC("texColor.rgb *= texColor.a;");
}
// Apply color conversion.
switch (color_conversion_mode_) {
case COLOR_CONVERSION_MODE_LUT:
......@@ -961,13 +955,30 @@ std::string FragmentShader::GetShaderSource() const {
HDR(" LutLookup(sampler, pos.xy + vec2(0, 1.0 / size)),");
HDR(" pos.z - layer);");
HDR("}");
// Un-premultiply by alpha.
if (premultiply_alpha_mode_ != NON_PREMULTIPLIED_ALPHA) {
SRC("// un-premultiply alpha");
SRC("if (texColor.a > 0.0) texColor.rgb /= texColor.a;");
}
SRC("texColor.rgb = LUT(lut_texture, texColor.xyz, lut_size).xyz;");
SRC("texColor.rgb *= texColor.a;");
break;
case COLOR_CONVERSION_MODE_SHADER:
header += color_transform_->GetShaderSource();
// Un-premultiply by alpha.
if (premultiply_alpha_mode_ != NON_PREMULTIPLIED_ALPHA) {
SRC("// un-premultiply alpha");
SRC("if (texColor.a > 0.0) texColor.rgb /= texColor.a;");
}
SRC("texColor.rgb = DoColorConversion(texColor.xyz);");
SRC("texColor.rgb *= texColor.a;");
break;
case COLOR_CONVERSION_MODE_NONE:
// Premultiply by alpha.
if (premultiply_alpha_mode_ == NON_PREMULTIPLIED_ALPHA) {
SRC("// Premultiply alpha");
SRC("texColor.rgb *= texColor.a;");
}
break;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment