skia2/tests/sksl/blend/BlendSaturation.glsl
John Stiles 2e6f60f423 Fix color fringes on blend_hue and blend_saturation.
Previously, we checked for division against zero, but didn't do anything
to prevent division against extraordinarily small values. Now, we only
saturate if the delta between max and min is greater than 0.00001.

Change-Id: I7d1df3430941c7e1a7f94e597d5449f9259612d6
Bug: skia:9320
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/527498
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
2022-04-05 19:46:58 +00:00

47 lines
2.3 KiB
GLSL

#version 400
out vec4 sk_FragColor;
uniform vec4 src;
uniform vec4 dst;
vec3 blend_set_color_luminance_Qh3h3hh3(vec3 hueSatColor, float alpha, vec3 lumColor) {
float lum = dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), lumColor);
vec3 result = (lum - dot(vec3(0.30000001192092896, 0.5899999737739563, 0.10999999940395355), hueSatColor)) + hueSatColor;
float minComp = min(min(result.x, result.y), result.z);
float maxComp = max(max(result.x, result.y), result.z);
if (minComp < 0.0 && lum != minComp) {
result = lum + (result - lum) * (lum / (lum - minComp));
}
if (maxComp > alpha && maxComp != lum) {
return lum + ((result - lum) * (alpha - lum)) / (maxComp - lum);
} else {
return result;
}
}
vec3 blend_set_color_saturation_helper_Qh3h3h(vec3 minMidMax, float sat) {
vec2 delta = minMidMax.yz - minMidMax.xx;
return delta.y >= 9.9999997473787516e-06 ? vec3(0.0, (delta.x / delta.y) * sat, sat) : vec3(0.0);
}
vec3 blend_set_color_saturation_Qh3h3h3(vec3 hueLumColor, vec3 satColor) {
float sat = max(max(satColor.x, satColor.y), satColor.z) - min(min(satColor.x, satColor.y), satColor.z);
if (hueLumColor.x <= hueLumColor.y) {
if (hueLumColor.y <= hueLumColor.z) {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor, sat);
} else if (hueLumColor.x <= hueLumColor.z) {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor.xzy, sat).xzy;
} else {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor.zxy, sat).yzx;
}
} else if (hueLumColor.x <= hueLumColor.z) {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor.yxz, sat).yxz;
} else if (hueLumColor.y <= hueLumColor.z) {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor.yzx, sat).zxy;
} else {
return blend_set_color_saturation_helper_Qh3h3h(hueLumColor.zyx, sat).zyx;
}
}
void main() {
float _0_alpha = dst.w * src.w;
vec3 _1_sda = src.xyz * dst.w;
vec3 _2_dsa = dst.xyz * src.w;
sk_FragColor = vec4((((blend_set_color_luminance_Qh3h3hh3(blend_set_color_saturation_Qh3h3h3(_2_dsa, _1_sda), _0_alpha, _2_dsa) + dst.xyz) - _2_dsa) + src.xyz) - _1_sda, (src.w + dst.w) - _0_alpha);
}