@MattP2 I don't see how this works. Depending on your input/original color you will get a different gray value in the computation:
color.rgb += brightness * color.a;
float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
Then this gray value will affect to colorizationColor in:
color.rgb = mix(color.rgb, gray * colorizationColor.rgb, colorizationAlpha);
So even if colorizationAlpha is 1.0, the gray affects the output.
It would work, if color was clamped to (1,1,1) after applyiing the brightness, but that doesn't seem to happen. I always get my colorizationColor scaled in the result, even with brightness: 1.