Fix warnings and remove casts by adding copy_vx_vx_uchar() functions.
[blender.git] / source / blender / blenlib / intern / math_color_blend_inline.c
index 1985e0611724586742c00d8230356ed57b9f6a3a..048ab71c6dc9119606dc7bed77c1df52fa53c47e 100644 (file)
@@ -36,7 +36,7 @@
 #ifndef __MATH_COLOR_BLEND_INLINE_C__
 #define __MATH_COLOR_BLEND_INLINE_C__
 
-/* don't add any saturation to a completly black and white image */
+/* don't add any saturation to a completely black and white image */
 #define EPS_SATURATION 0.0005f
 #define EPS_ALPHA 0.0005f
 
@@ -72,7 +72,7 @@ MINLINE void blend_color_mix_byte(unsigned char dst[4], const unsigned char src1
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -94,7 +94,7 @@ MINLINE void blend_color_add_byte(unsigned char dst[4], const unsigned char src1
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -116,7 +116,7 @@ MINLINE void blend_color_sub_byte(unsigned char dst[4], const unsigned char src1
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -139,7 +139,7 @@ MINLINE void blend_color_mul_byte(unsigned char dst[4], const unsigned char src1
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -162,7 +162,7 @@ MINLINE void blend_color_lighten_byte(unsigned char dst[4], const unsigned char
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -185,7 +185,7 @@ MINLINE void blend_color_darken_byte(unsigned char dst[4], const unsigned char s
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -202,7 +202,7 @@ MINLINE void blend_color_erase_alpha_byte(unsigned char dst[4], const unsigned c
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -219,388 +219,243 @@ MINLINE void blend_color_add_alpha_byte(unsigned char dst[4], const unsigned cha
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 MINLINE void blend_color_overlay_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = (int)src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-               if (src1[0] > 127)
-                       temp = 255 - ((255 - 2 * (src1[0] - 127)) * (255 - src2[0]) / 255);
-               else
-                       temp = (2 * src1[0] * src2[0]) >> 8;
-               temp = (temp * fac + src1[0] * mfac) / 255;
-               if (temp < 255)
-                       dst[0] = temp;
-               else
-                       dst[0] = 255;
-               if (src1[1] > 127)
-                       temp = 255 - ((255 - 2 * (src1[1] - 127)) * (255 - src2[1]) / 255);
-               else
-                       temp = (2 * src1[1] * src2[1]) / 255;
-
-               temp = (temp * fac + src1[1] * mfac) / 255;
-               if (temp < 255)
-                       dst[1] = temp;
-               else
-                       dst[1] = 255;
-
-               if (src1[2] > 127)
-                       temp = 255 - ((255 - 2 * (src1[2] - 127)) * (255 - src2[2]) / 255);
-               else
-                       temp = (2 * src1[2] * src2[2]) / 255;
-
-               temp = (temp * fac + src1[2] * mfac) / 255;
-               if (temp < 255)
-                       dst[2] = temp;
-               else
-                       dst[2] = 255;
+               const int mfac = 255 - fac;
+               int i = 3;
+
+               while (i--) {
+                       int temp;
+
+                       if (src1[i] > 127) {
+                               temp = 255 - ((255 - 2 * (src1[i] - 127)) * (255 - src2[i]) / 255);
+                       }
+                       else {
+                               temp = (2 * src1[i] * src2[i]) >> 8;
+                       }
+                       dst[i] = (unsigned char)min_ii((temp * fac + src1[i] * mfac) / 255, 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_hardlight_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = (int)src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-               if (src2[0] > 127)
-                       temp = 255 - ((255 - 2 * (src2[0] - 127)) * (255 - src1[0]) / 255);
-               else
-                       temp = (2 * src2[0] * src1[0]) >> 8;
-               temp = (temp * fac + src1[0] * mfac) / 255;
-               if (temp < 255) dst[0] = temp; else dst[0] = 255;
-
-
-               if (src2[1] > 127)
-                       temp = 255 - ((255 - 2 * (src2[1] - 127)) * (255 - src1[1]) / 255);
-               else
-                       temp = (2 * src2[1] * src1[1]) / 255;
-               temp = (temp * fac + src1[1] * mfac) / 255;
-               if (temp < 255) dst[1] = temp; else dst[1] = 255;
-
-
-               if (src2[2] > 127)
-                       temp = 255 - ((255 - 2 * (src2[2] - 127)) * (255 - src1[2]) / 255);
-               else
-                       temp = (2 * src2[2] * src1[2]) / 255;
-
-               temp = (temp * fac + src1[2] * mfac) / 255;
-               if (temp < 255) dst[2] = temp; else dst[2] = 255;
+               const int mfac = 255 - fac;
+               int i = 3;
+
+               while (i--) {
+                       int temp;
+
+                       if (src2[i] > 127) {
+                               temp = 255 - ((255 - 2 * (src2[i] - 127)) * (255 - src1[i]) / 255);
+                       }
+                       else {
+                               temp = (2 * src2[i] * src1[i]) >> 8;
+                       }
+                       dst[i] = (unsigned char)min_ii((temp * fac + src1[i] * mfac) / 255, 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_burn_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-
-               if (src2[0] == 0)
-                       temp = 0;
-               else
-                       temp = 255 - ((255 - src1[0]) * 255) / src2[0];
-               if (temp < 0)
-                       temp = 0;
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-
-               if (src2[1] == 0)
-                       temp = 0;
-               else
-                       temp = 255 - ((255 - src1[1]) * 255) / src2[1];
-               if (temp < 0)
-                       temp = 0;
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-
-               if (src2[2] == 0)
-                       temp = 0;
-               else
-                       temp = 255 - ((255 - src1[2]) * 255) / src2[2];
-               if (temp < 0)
-                       temp = 0;
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
+               while (i--) {
+                       const int temp = (src2[i] == 0) ? 0 : max_ii(255 - ((255 - src1[i]) * 255) / src2[i], 0);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_linearburn_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               temp = src1[0] + src2[0] - 255;
-               if (temp < 0) temp = 0;
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
-               temp = src1[1] + src2[1] - 255;
-               if (temp < 0) temp = 0;
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               temp = src1[2] + src2[2] - 255;
-               if (temp < 0) temp = 0;
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               while (i--) {
+                       const int temp = max_ii(src1[i] + src2[i] - 255, 0);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_dodge_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
+               const int mfac = 255 - fac;
+               int i = 3;
 
-               if (src2[0] == 255) temp = 255;
-               else temp = (src1[0] * 255) / (255 - src2[0]);
-               if (temp > 255) temp = 255;
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-               if (src2[1] == 255) temp = 255;
-               else temp = (src1[1] * 255) / (255 - src2[1]);
-               if (temp > 255) temp = 255;
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               if (src2[2] == 255) temp = 255;
-               else temp = (src1[2] * 255) / (255 - src2[2]);
-               if (temp > 255) temp = 255;
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               while (i--) {
+                       const int temp = (src2[i] == 255) ? 255 : min_ii((src1[i] * 255) / (255 - src2[i]), 255);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 MINLINE void blend_color_screen_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               temp = 255 - (((255 - src1[0]) * (255 - src2[0])) / 255);
-               if (temp < 0) temp = 0;
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
-               temp = 255 - (((255 - src1[1]) * (255 - src2[1])) / 255);
-               if (temp < 0) temp = 0;
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               temp = 255 - (((255 - src1[2]) * (255 - src2[2])) / 255);
-               if (temp < 0) temp = 0;
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               while (i--) {
+                       const int temp = max_ii(255 - (((255 - src1[i]) * (255 - src2[i])) / 255), 0);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_softlight_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               temp = ((unsigned char)((src1[0] < 127) ? ((2 * ((src2[0] / 2) + 64)) * (src1[0])) / 255 : (255 - (2 * (255 - ((src2[0] / 2) + 64)) * (255 - src1[0]) / 255))));
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-               temp = ((unsigned char)((src1[1] < 127) ? ((2 * ((src2[1] / 2) + 64)) * (src1[1])) / 255 : (255 - (2 * (255 - ((src2[1] / 2) + 64)) * (255 - src1[1]) / 255))));
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               temp = ((unsigned char)((src1[2] < 127) ? ((2 * ((src2[2] / 2) + 64)) * (src1[2])) / 255 : (255 - (2 * (255 - ((src2[2] / 2) + 64)) * (255 - src1[2]) / 255))));
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
+
+               while (i--) {
+                       int temp;
+
+                       if (src1[i] < 127) {
+                               temp = ((2 * ((src2[i] / 2) + 64)) * src1[i]) / 255;
+                       }
+                       else {
+                               temp = 255 - (2 * (255 - ((src2[i] / 2) + 64)) * (255 - src1[i]) / 255);
+                       }
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_pinlight_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               if (src2[0] > 127) {
-                       temp = 2 * (src2[0] - 127);
-                       if (src1[0] > temp)
-                               temp = src1[0];
-               }
-               else {
-                       temp = 2 * src2[0];
-                       if (src1[0] < temp)
-                               temp = src1[0];
-               }
-
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-
-               if (src2[1] > 127) {
-                       temp = 2 * (src2[1] - 127);
-                       if (src1[1] > temp) temp = src1[1];
+               const int mfac = 255 - fac;
+               int i = 3;
+
+               while (i--) {
+                       int temp;
+
+                       if (src2[i] > 127) {
+                               temp = max_ii(2 * (src2[i] - 127), src1[i]);
+                       }
+                       else {
+                               temp = min_ii(2 * src2[i], src1[i]);
+                       }
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
                }
-               else {
-                       temp = 2 * src2[1];
-                       if (src1[1] < temp) temp = src1[1];
-               }
-
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-
-               if (src2[2] > 127) {
-                       temp = 2 * (src2[2] - 127);
-                       if (src1[2] > temp) temp = src1[2];
-               }
-               else {
-                       temp = 2 * src2[2];
-                       if (src1[2] < temp) temp = src1[2];
-               }
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_linearlight_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               if (src2[0] > 127) {
-                       temp = src1[0] + 2 * (src2[0] - 127);
-                       if (temp > 255)
-                               temp = 255;
-               }
-               else {
-                       temp = src1[0] + 2 * src2[0] - 255;
-                       if (temp < 0) temp = 0;
-               }
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-               if (src2[1] > 127) {
-                       temp = src1[1] + 2 * (src2[1] - 127);
-                       if (temp > 255)
-                               temp = 255;
-               }
-               else {
-                       temp = src1[1] + 2 * src2[1] - 255;
-                       if (temp < 0) temp = 0;
-               }
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               if (src2[2] > 127) {
-                       temp = src1[2] + 2 * (src2[2] - 127);
-                       if (temp > 255)
-                               temp = 255;
+               const int mfac = 255 - fac;
+               int i = 3;
+
+               while (i--) {
+                       int temp;
+
+                       if (src2[i] > 127) {
+                               temp = min_ii(src1[i] + 2 * (src2[i] - 127), 255);
+                       }
+                       else {
+                               temp = max_ii(src1[i] + 2 * src2[i] - 255, 0);
+                       }
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
                }
-               else {
-                       temp = src1[2] + 2 * src2[2] - 255;
-                       if (temp < 0) temp = 0;
-               }
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_vividlight_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-
-               if (src2[0] == 255)
-                       temp = 255;
-               else if (src2[0] == 0)
-                       temp = 0;
-               else if (src2[0] > 127)  {
-                       temp = ((src1[0]) * 255) / (2 * (255 - src2[0]));
-                       if (temp > 255) temp = 255;
-               }
-               else {
-                       temp = 255 - ((255 - src1[0]) * 255 / (2 * src2[0]));
-                       if (temp < 0) temp = 0;
-               }
-
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
-               if (src2[1] == 255)
-                       temp = 255;
-               else if (src2[1] == 0)
-                       temp = 0;
-               else if (src2[1] > 127)  {
-                       temp = ((src1[1]) * 255) / (2 * (255 - src2[1]));
-                       if (temp > 255) temp = 255;
-               }
-               else {
-                       temp = 255 - ((255 - src1[1]) * 255 / (2 * src2[1]));
-                       if (temp < 0) temp = 0;
-               }
+               while (i--) {
+                       int temp;
 
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               if (src2[2] == 255)
-                       temp = 255;
-               else if (src2[2] == 0)
-                       temp = 0;
-               else if (src2[2] > 127)  {
-                       temp = ((src1[2]) * 255) / (2 * (255 - src2[2]));
-                       if (temp > 255) temp = 255;
-               }
-               else {
-                       temp = 255 - ((255 - src1[2]) * 255 / (2 * src2[2]));
-                       if (temp < 0) temp = 0;
+                       if (src2[i] == 255) {
+                               temp = 255;
+                       }
+                       else if (src2[i] == 0) {
+                               temp = 0;
+                       }
+                       else if (src2[i] > 127)  {
+                               temp = min_ii(((src1[i]) * 255) / (2 * (255 - src2[i])), 255);
+                       }
+                       else {
+                               temp = max_ii(255 - ((255 - src1[i]) * 255 / (2 * src2[i])), 0);
+                       }
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
                }
-
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -608,56 +463,46 @@ MINLINE void blend_color_vividlight_byte(unsigned char dst[4], unsigned const ch
 
 MINLINE void blend_color_difference_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-               temp = src1[0] - src2[0];
-               if (temp < 0) temp = -temp;
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-               temp = src1[1] - src2[1];
-               if (temp < 0) temp = -temp;
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
-
-               temp = src1[2] - src2[2];
-               if (temp < 0) temp = -temp;
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
+               while (i--) {
+                       const int temp = abs(src1[i] - src2[i]);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 
 MINLINE void blend_color_exclusion_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int temp;
-               int mfac = 255 - fac;
-               temp = 127 - ((2 * (src1[0] - 127) * (src2[0] - 127)) / 255);
-               dst[0] = (temp * fac + src1[0] * mfac) / 255;
-
-               temp = 127 - ((2 * (src1[1] - 127) * (src2[1] - 127)) / 255);
-               dst[1] = (temp * fac + src1[1] * mfac) / 255;
+               const int mfac = 255 - fac;
+               int i = 3;
 
-               temp = 127 - ((2 * (src1[2] - 127) * (src2[2] - 127)) / 255);
-               dst[2] = (temp * fac + src1[2] * mfac) / 255;
+               while (i--) {
+                       const int temp = 127 - ((2 * (src1[i] - 127) * (src2[i] - 127)) / 255);
+                       dst[i] = (unsigned char)((temp * fac + src1[i] * mfac) / 255);
+               }
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 MINLINE void blend_color_color_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int mfac = 255 - fac;
+               const int mfac = 255 - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
@@ -670,21 +515,21 @@ MINLINE void blend_color_color_byte(unsigned char dst[4], unsigned const char sr
 
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
 
-               dst[0] = ((int)(r * 255.0f) * fac + src1[0] * mfac) / 255;
-               dst[1] = ((int)(g * 255.0f) * fac + src1[1] * mfac) / 255;
-               dst[2] = ((int)(b * 255.0f) * fac + src1[2] * mfac) / 255;
+               dst[0] = (unsigned char)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
+               dst[1] = (unsigned char)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
+               dst[2] = (unsigned char)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 MINLINE void blend_color_hue_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int mfac = 255 - fac;
+               const int mfac = 255 - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
@@ -696,22 +541,22 @@ MINLINE void blend_color_hue_byte(unsigned char dst[4], unsigned const char src1
 
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
 
-               dst[0] = ((int)(r * 255.0f) * fac + src1[0] * mfac) / 255;
-               dst[1] = ((int)(g * 255.0f) * fac + src1[1] * mfac) / 255;
-               dst[2] = ((int)(b * 255.0f) * fac + src1[2] * mfac) / 255;
+               dst[0] = (unsigned char)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
+               dst[1] = (unsigned char)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
+               dst[2] = (unsigned char)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 
 }
 
 MINLINE void blend_color_saturation_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int mfac = 255 - fac;
+               const int mfac = 255 - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
@@ -724,40 +569,39 @@ MINLINE void blend_color_saturation_byte(unsigned char dst[4], unsigned const ch
 
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
 
-               dst[0] = ((int)(r * 255.0f) * fac + src1[0] * mfac) / 255;
-               dst[1] = ((int)(g * 255.0f) * fac + src1[1] * mfac) / 255;
-               dst[2] = ((int)(b * 255.0f) * fac + src1[2] * mfac) / 255;
+               dst[0] = (unsigned char)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
+               dst[1] = (unsigned char)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
+               dst[2] = (unsigned char)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
 MINLINE void blend_color_luminosity_byte(unsigned char dst[4], unsigned const char src1[4], unsigned const char src2[4])
 {
-       const unsigned char fac = src2[3];
+       const int fac = src2[3];
        if (fac != 0) {
-               int mfac = 255 - fac;
+               const int mfac = 255 - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
                rgb_to_hsv(src1[0] / 255.0f, src1[1] / 255.0f, src1[2] / 255.0f, &h1, &s1, &v1);
                rgb_to_hsv(src2[0] / 255.0f, src2[1] / 255.0f, src2[2] / 255.0f, &h2, &s2, &v2);
 
-
                v1 = v2;
 
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
 
-               dst[0] = ((int)(r * 255.0f) * fac + src1[0] * mfac) / 255;
-               dst[1] = ((int)(g * 255.0f) * fac + src1[1] * mfac) / 255;
-               dst[2] = ((int)(b * 255.0f) * fac + src1[2] * mfac) / 255;
+               dst[0] = (unsigned char)(((int)(r * 255.0f) * fac + src1[0] * mfac) / 255);
+               dst[1] = (unsigned char)(((int)(g * 255.0f) * fac + src1[1] * mfac) / 255);
+               dst[2] = (unsigned char)(((int)(b * 255.0f) * fac + src1[2] * mfac) / 255);
 
        }
        else {
                /* no op */
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 
 }
@@ -777,7 +621,7 @@ MINLINE void blend_color_interpolate_byte(unsigned char dst[4], const unsigned c
                dst[3] = (unsigned char)divide_round_i(tmp, 255);
        }
        else {
-               copy_v4_v4_char((char *)dst, (char *)src1);
+               copy_v4_v4_uchar(dst, src1);
        }
 }
 
@@ -937,45 +781,24 @@ MINLINE void blend_color_add_alpha_float(float dst[4], const float src1[4], cons
        }
 }
 
-MINLINE void blend_color_overlay_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const float src2[4])
 {
-       float fac = src2[3];
+       const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-
-               float temp;
-               float fac = src2[3];
-               float mfac = 1.0f - fac;
-
-               if (src1[0] > 0.5f)
-                       temp = 1 - (1 - 2 * (src1[0] - 0.5f)) * (1 - src2[0]);
-               else
-                       temp = 2 * src1[0] * src2[0];
-               temp = temp * fac + src1[0] * mfac;
-               if (temp < 1.0f)
-                       dst[0] = temp;
-               else
-                       dst[0] = 1.0f;
-
-
-               if (src1[1] > 0.5f)
-                       temp = 1.0f - (1.0f - 2.0f * (src1[1] - 0.5f)) * (1.0f - src2[1]);
-               else
-                       temp = 2.0f * src1[1] * src2[1];
-               temp = temp * fac + src1[1] * mfac;
-               if (temp < 1.0f)
-                       dst[1] = temp;
-               else
-                       dst[1] = 1.0f;
-
-               if (src1[2] > 0.5f)
-                       temp = 1 - (1.0f - 2.0f * (src1[2] - 0.5f)) * (1.0f - src2[2]);
-               else
-                       temp = 2.0f * src1[2] * src2[2];
-               temp = temp * fac + src1[2] * mfac;
-               if (temp < 1.0f)
-                       dst[2] = temp;
-               else
-                       dst[2] = 1.0f;
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       float temp;
+
+                       if (src1[i] > 0.5f) {
+                               temp = 1.0f - (1.0f - 2.0f * (src1[i] - 0.5f)) * (1.0f - src2[i]);
+                       }
+                       else {
+                               temp = 2.0f * src1[i] * src2[i];
+                       }
+                       dst[i] = min_ff(temp * fac + src1[i] * mfac, 1.0f);
+               }
        }
        else {
                /* no op */
@@ -984,37 +807,24 @@ MINLINE void blend_color_overlay_float(float dst[3], const float src1[3], const
 }
 
 
-MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[2])
+MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-               if (src2[0] > 0.5f)
-                       temp = 1 - ((1.0f - 2.0f * (src2[0] - 0.5f)) * (1.0f - src1[0]));
-               else
-                       temp = 2.0f * src2[0] * src1[0];
-               temp = (temp * fac + src1[0] * mfac) / 1.0f;
-               if (temp < 1.0f) dst[0] = temp; else dst[0] = 1.0f;
-
-               if (src2[1] > 0.5f)
-                       temp = 1 - ((1.0f - 2.0f * (src2[1] - 0.5f)) * (1.0f - src1[1]));
-               else
-                       temp = 2.0f * src2[1] * src1[1];
-               temp = (temp * fac + src1[1] * mfac) / 1.0f;
-               if (temp < 1.0f) dst[1] = temp; else dst[1] = 1.0f;
-
-               if (src2[2] > 0.5f)
-                       temp = 1 - ((1.0f - 2.0f * (src2[2] - 0.5f)) * (1.0f - src1[2]));
-               else
-                       temp = 2.0f * src2[2] * src1[2];
-               temp = (temp * fac + src1[2] * mfac) / 1.0f;
-
-               if (temp < 1.0f)
-                       dst[2] = temp;
-               else
-                       dst[2] = 1.0f;
-
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       float temp;
+
+                       if (src2[i] > 0.5f) {
+                               temp = 1.0f - ((1.0f - 2.0f * (src2[i] - 0.5f)) * (1.0f - src1[i]));
+                       }
+                       else {
+                               temp = 2.0f * src2[i] * src1[i];
+                       }
+                       dst[i] = min_ff((temp * fac + src1[i] * mfac) / 1.0f, 1.0f);
+               }
        }
        else {
                /* no op */
@@ -1022,36 +832,17 @@ MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], cons
        }
 }
 
-MINLINE void blend_color_burn_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               if (src2[0] == 0.0f)
-                       temp = 0.0f;
-               else
-                       temp = 1.0f - ((1.0f - src1[0]) / src2[0]);
-               if (temp < 0.0f)
-                       temp = 0.0f;
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               if (src2[1] == 0.0f)
-                       temp = 0.0f;
-               else
-                       temp = 1.0f - ((1.0f - src1[1]) / src2[1]);
-               if (temp < 0.0f)
-                       temp = 0.0f;
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               if (src2[2] == 0.0f)
-                       temp = 0.0f;
-               else
-                       temp = 1.0f - ((1.0f - src1[2]) / src2[2]);
-               if (temp < 0.0f)
-                       temp = 0.0f;
-               dst[2] = (temp * fac + src1[2] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       const float temp = (src2[i] == 0.0f) ? 0.0f : max_ff(1.0f - ((1.0f - src1[i]) / src2[i]), 0.0f);
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1059,25 +850,17 @@ MINLINE void blend_color_burn_float(float dst[3], const float src1[3], const flo
        }
 }
 
-MINLINE void blend_color_linearburn_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               temp = src1[0] + src2[0] - 1.0f;
-               if (temp < 0) temp = 0;
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               temp = src1[1] + src2[1] - 1.0f;
-               if (temp < 0) temp = 0;
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               temp = src1[2] + src2[2] - 1.0f;
-               if (temp < 0) temp = 0;
-               dst[2] = (temp * fac + src1[2] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
+               while (i--) {
+                       const float temp = max_ff(src1[i] + src2[i] - 1.0f, 0.0f);
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1086,27 +869,17 @@ MINLINE void blend_color_linearburn_float(float dst[3], const float src1[3], con
 }
 
 
-MINLINE void blend_color_dodge_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               if (src2[0] >= 1.0f) temp = 1.0f;
-               else temp = (src1[0]) / (1.0f - src2[0]);
-               if (temp > 1.0f) temp = 1.0f;
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               if (src2[1] >= 1.0f) temp = 1.0f;
-               else temp = (src1[1]) / (1.0f - src2[1]);
-               if (temp > 1.0f) temp = 1.0f;
-               dst[1] = (temp * fac + src1[1] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
-               if (src2[2] >= 1.0f) temp = 1.0f;
-               else temp = (src1[2]) / (1.0f - src2[2]);
-               if (temp > 1.0f) temp = 1.0f;
-               dst[2] = (temp * fac + src1[2] * mfac);
+               while (i--) {
+                       const float temp = (src2[i] >= 1.0f) ? 1.0f : min_ff(src1[i] / (1.0f - src2[i]), 1.0f);
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1114,24 +887,17 @@ MINLINE void blend_color_dodge_float(float dst[3], const float src1[3], const fl
        }
 }
 
-MINLINE void blend_color_screen_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               temp = 1.0f - ((1.0f - src1[0]) * (1.0f - src2[0]));
-               if (temp < 0) temp = 0;
-               dst[0] = (temp * fac + src1[0] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
-               temp = 1.0f - ((1.0f - src1[1]) * (1.0f - src2[1]));
-               if (temp < 0) temp = 0;
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               temp = 1.0f - ((1.0f - src1[2]) * (1.0f - src2[2]));
-               if (temp < 0) temp = 0;
-               dst[2] = (temp * fac + src1[2] * mfac);
+               while (i--) {
+                       const float temp = max_ff(1.0f - ((1.0f - src1[i]) * (1.0f - src2[i])), 0.0f);
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1139,21 +905,24 @@ MINLINE void blend_color_screen_float(float dst[3], const float src1[3], const f
        }
 }
 
-MINLINE void blend_color_softlight_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               temp = (((src1[0] < 0.5f) ? ((src2[0] + 0.5f) * (src1[0])) : (1.0f - ((1.0f - ((src2[0]) + 0.5f)) * (1.0f - src1[0])))));
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               temp = (((src1[1] < 0.5f) ? ((src2[1] + 0.5f) * (src1[1])) : (1.0f - ((1.0f - ((src2[1]) + 0.5f)) * (1.0f - src1[1])))));
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               temp = (((src1[2] < 0.5f) ? ((src2[2] + 0.5f) * (src1[2])) : (1.0f - ((1.0f - ((src2[2]) + 0.5f)) * (1.0f - src1[2])))));
-               dst[2] = (temp * fac + src1[2] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       float temp;
+
+                       if (src1[i] < 0.5f) {
+                               temp = (src2[i] + 0.5f) * src1[i];
+                       }
+                       else {
+                               temp = 1.0f - ((1.0f - (src2[i] + 0.5f)) * (1.0f - src1[i]));
+                       }
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1161,48 +930,24 @@ MINLINE void blend_color_softlight_float(float dst[3], const float src1[3], cons
        }
 }
 
-MINLINE void blend_color_pinlight_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               if (src2[0] > 0.5f) {
-                       temp = 2 * (src2[0] - 0.5f);
-                       if (src1[0] > temp)
-                               temp = src1[0];
-               }
-               else {
-                       temp = 2 * src2[0];
-                       if (src1[0] < temp)
-                               temp = src1[0];
-               }
-
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-
-               if (src2[1] > 0.5f) {
-                       temp = 2 * (src2[1] - 0.5f);
-                       if (src1[1] > temp) temp = src1[1];
-               }
-               else {
-                       temp = 2 * src2[1];
-                       if (src1[1] < temp) temp = src1[1];
-               }
-
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-
-               if (src2[2] > 0.5f) {
-                       temp = 2 * (src2[2] - 0.5f);
-                       if (src1[2] > temp) temp = src1[2];
-               }
-               else {
-                       temp = 2 * src2[2];
-                       if (src1[2] < temp) temp = src1[2];
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       float temp;
+
+                       if (src2[i] > 0.5f) {
+                               temp = max_ff(2.0f * (src2[i] - 0.5f), src1[i]);
+                       }
+                       else {
+                               temp = min_ff(2.0f * src2[i], src1[i]);
+                       }
+                       dst[i] = (temp * fac + src1[i] * mfac);
                }
-               dst[2] = (temp * fac + src1[2] * mfac);
        }
        else {
                /* no op */
@@ -1211,45 +956,24 @@ MINLINE void blend_color_pinlight_float(float dst[3], const float src1[3], const
 }
 
 
-MINLINE void blend_color_linearlight_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               if (src2[0] > 0.5f) {
-                       temp = src1[0] + 2 * (src2[0] - 0.5f);
-                       if (temp > 1.0f)
-                               temp = 1.0f;
-               }
-               else {
-                       temp = src1[0] + 2 * src2[0] - 1.0f;
-                       if (temp < 0) temp = 0;
-               }
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               if (src2[1] > 0.5f) {
-                       temp = src1[1] + 2 * (src2[1] - 0.5f);
-                       if (temp > 1.0f)
-                               temp = 1.0f;
-               }
-               else {
-                       temp = src1[1] + 2 * src2[1] - 1.0f;
-                       if (temp < 0) temp = 0;
-               }
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               if (src2[2] > 0.5f) {
-                       temp = src1[2] + 2 * (src2[2] - 0.5f);
-                       if (temp > 1.0f)
-                               temp = 1.0f;
+               const float mfac = 1.0f - fac;
+               int i = 3;
+
+               while (i--) {
+                       float temp;
+
+                       if (src2[i] > 0.5f) {
+                               temp = min_ff(src1[i] + 2.0f * (src2[i] - 0.5f), 1.0f);
+                       }
+                       else {
+                               temp = max_ff(src1[i] + 2.0f * src2[i] - 1.0f, 0.0f);
+                       }
+                       dst[i] = (temp * fac + src1[i] * mfac);
                }
-               else {
-                       temp = src1[2] + 2 * src2[2] - 1.0f;
-                       if (temp < 0) temp = 0;
-               }
-               dst[2] = (temp * fac + src1[2] * mfac);
        }
        else {
                /* no op */
@@ -1258,57 +982,30 @@ MINLINE void blend_color_linearlight_float(float dst[3], const float src1[3], co
 }
 
 
-MINLINE void blend_color_vividlight_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-
-               if (src2[0] == 1.0f)
-                       temp = 1.0f;
-               else if (src2[0] == 0)
-                       temp = 0;
-               else if (src2[0] > 0.5f) {
-                       temp = ((src1[0]) * 1.0f) / (2 * (1.0f - src2[0]));
-                       if (temp > 1.0f) temp = 1.0f;
-               }
-               else {
-                       temp = 1.0f - ((1.0f - src1[0]) * 1.0f / (2 * src2[0]));
-                       if (temp < 0) temp = 0;
-               }
-
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               if (src2[1] == 1.0f)
-                       temp = 1.0f;
-               else if (src2[1] == 0)
-                       temp = 0;
-               else if (src2[1] > 0.5f) {
-                       temp = ((src1[1]) * 1.0f) / (2 * (1.0f - src2[1]));
-                       if (temp > 1.0f) temp = 1.0f;
-               }
-               else {
-                       temp = 1.0f - ((1.0f - src1[1]) * 1.0f / (2 * src2[1]));
-                       if (temp < 0) temp = 0;
-               }
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
-               dst[1] = (temp * fac + src1[1] * mfac);
+               while (i--) {
+                       float temp;
 
-               if (src2[2] == 1.0f)
-                       temp = 1.0f;
-               else if (src2[2] == 0)
-                       temp = 0;
-               else if (src2[2] > 0.5f) {
-                       temp = ((src1[2]) * 1.0f) / (2 * (1.0f - src2[2]));
-                       if (temp > 1.0f) temp = 1.0f;
-               }
-               else {
-                       temp = 1.0f - ((1.0f - src1[2]) * 1.0f / (2 * src2[2]));
-                       if (temp < 0) temp = 0;
+                       if (src2[i] == 1.0f) {
+                               temp = 1.0f;
+                       }
+                       else if (src2[i] == 0.0f) {
+                               temp = 0.0f;
+                       }
+                       else if (src2[i] > 0.5f) {
+                               temp = min_ff(((src1[i]) * 1.0f) / (2.0f * (1.0f - src2[i])), 1.0f);
+                       }
+                       else {
+                               temp = max_ff(1.0f - ((1.0f - src1[i]) * 1.0f / (2.0f * src2[i])), 0.0f);
+                       }
+                       dst[i] = (temp * fac + src1[i] * mfac);
                }
-
-               dst[2] = (temp * fac + src1[2] * mfac);
        }
        else {
                /* no op */
@@ -1316,24 +1013,16 @@ MINLINE void blend_color_vividlight_float(float dst[3], const float src1[3], con
        }
 }
 
-MINLINE void blend_color_difference_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_difference_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-               temp = src1[0] - src2[0];
-               if (temp < 0) temp = -temp;
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               temp = src1[1] - src2[1];
-               if (temp < 0) temp = -temp;
-               dst[1] = (temp * fac + src1[1] * mfac);
-
-               temp = src1[2] - src2[2];
-               if (temp < 0) temp = -temp;
-               dst[2] = (temp * fac + src1[2] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
+               while (i--) {
+                       dst[i] = (fabsf(src1[i] - src2[i]) * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1342,20 +1031,17 @@ MINLINE void blend_color_difference_float(float dst[3], const float src1[3], con
 }
 
 
-MINLINE void blend_color_exclusion_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float temp;
-               float mfac = 1.0f - fac;
-               temp = 0.5f - ((2 * (src1[0] - 0.5f) * (src2[0] - 0.5f)));
-               dst[0] = (temp * fac + src1[0] * mfac);
-
-               temp = 0.5f - ((2 * (src1[1] - 0.5f) * (src2[1] - 0.5f)));
-               dst[1] = (temp * fac + src1[1] * mfac);
+               const float mfac = 1.0f - fac;
+               int i = 3;
 
-               temp = 0.5f - ((2 * (src1[2] - 0.5f) * (src2[2] - 0.5f)));
-               dst[2] = (temp * fac + src1[2] * mfac);
+               while (i--) {
+                       const float temp = 0.5f - ((2 * (src1[i] - 0.5f) * (src2[i] - 0.5f)));
+                       dst[i] = (temp * fac + src1[i] * mfac);
+               }
        }
        else {
                /* no op */
@@ -1364,18 +1050,18 @@ MINLINE void blend_color_exclusion_float(float dst[3], const float src1[3], cons
 
 }
 
-MINLINE void blend_color_color_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_color_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float mfac = 1.0f - fac;
+               const float mfac = 1.0f - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
+
                rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
                rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
 
-
                h1 = h2;
                s1 = s2;
 
@@ -1392,18 +1078,18 @@ MINLINE void blend_color_color_float(float dst[3], const float src1[3], const fl
 }
 
 
-MINLINE void blend_color_hue_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float mfac = 1.0f - fac;
+               const float mfac = 1.0f - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
+
                rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
                rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
 
-
                h1 = h2;
 
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
@@ -1418,14 +1104,15 @@ MINLINE void blend_color_hue_float(float dst[3], const float src1[3], const floa
        }
 }
 
-MINLINE void blend_color_saturation_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float mfac = 1.0f - fac;
+               const float mfac = 1.0f - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
+
                rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
                rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
 
@@ -1444,18 +1131,18 @@ MINLINE void blend_color_saturation_float(float dst[3], const float src1[3], con
        }
 }
 
-MINLINE void blend_color_luminosity_float(float dst[3], const float src1[3], const float src2[3])
+MINLINE void blend_color_luminosity_float(float dst[4], const float src1[4], const float src2[4])
 {
        const float fac = src2[3];
        if (fac != 0.0f && fac < 1.0f) {
-               float mfac = 1.0f - fac;
+               const float mfac = 1.0f - fac;
                float h1, s1, v1;
                float h2, s2, v2;
                float r, g, b;
+
                rgb_to_hsv(src1[0], src1[1], src1[2], &h1, &s1, &v1);
                rgb_to_hsv(src2[0], src2[1], src2[2], &h2, &s2, &v2);
 
-
                v1 = v2;
                hsv_to_rgb(h1, s1, v1, &r, &g, &b);
 
@@ -1473,7 +1160,7 @@ MINLINE void blend_color_luminosity_float(float dst[3], const float src1[3], con
 MINLINE void blend_color_interpolate_float(float dst[4], const float src1[4], const float src2[4], float t)
 {
        /* interpolation, colors are premultiplied so it goes fine */
-       float mt = 1.0f - t;
+       const float mt = 1.0f - t;
 
        dst[0] = mt * src1[0] + t * src2[0];
        dst[1] = mt * src1[1] + t * src2[1];