Fix T65187: Overlay blend increase wrongly the opacity
The calculation of the mix color was not using the bottom color when the alpha was lower than 1.0. Also added clamp code to avoid values outside valid ranges.
This commit is contained in:
@@ -43,39 +43,38 @@ vec4 get_blend_color(int mode, vec4 src_color, vec4 blend_color)
|
||||
outcolor = src_color;
|
||||
}
|
||||
else if (mode == MODE_OVERLAY) {
|
||||
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
|
||||
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
|
||||
outcolor.r = overlay_color(src_color.r, mix_color.r);
|
||||
outcolor.g = overlay_color(src_color.g, mix_color.g);
|
||||
outcolor.b = overlay_color(src_color.b, mix_color.b);
|
||||
outcolor.a = src_color.a;
|
||||
}
|
||||
else if (mode == MODE_ADD) {
|
||||
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
|
||||
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
|
||||
outcolor = src_color + mix_color;
|
||||
outcolor.a = src_color.a;
|
||||
}
|
||||
else if (mode == MODE_SUB) {
|
||||
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
|
||||
outcolor = src_color - mix_color;
|
||||
outcolor.a = clamp(src_color.a - (mix_color.a * blend_opacity), 0.0, 1.0);
|
||||
}
|
||||
else if (mode == MODE_MULTIPLY) {
|
||||
/* interpolate between 1 and color using opacity */
|
||||
mix_color.rgb = mix(vec3(1, 1, 1), mix_color.rgb * mix_color.a, blend_opacity);
|
||||
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
|
||||
outcolor = src_color * mix_color;
|
||||
outcolor.a = src_color.a;
|
||||
}
|
||||
else if (mode == MODE_DIVIDE) {
|
||||
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
|
||||
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
|
||||
outcolor = src_color / mix_color;
|
||||
outcolor.a = src_color.a;
|
||||
}
|
||||
else {
|
||||
outcolor = mix_color * blend_opacity;
|
||||
;
|
||||
outcolor.a = src_color.a;
|
||||
}
|
||||
|
||||
return outcolor;
|
||||
return clamp(outcolor, 0.0, 1.0);
|
||||
}
|
||||
|
||||
float linearrgb_to_srgb(float c)
|
||||
|
||||
Reference in New Issue
Block a user