Don't you use the bklue channel ?
This shaders seems good. Maybe faster by starting with
if (color.a == 0.0f)
after the texture sampling, and making the changes afterwards.
If you only have 0 or 1 in alpha, and no gradient, it can be done in a simple line:
color = color + new_color *color.a;
may do the trick (I did not test it thought).
If not, how do you loop on your sprites to draw them ?