special case all 0 to map to all 0 in nonpremul
authorØyvind Kolås <pippin@gimp.org>
Mon, 27 Aug 2018 22:32:47 +0000 (00:32 +0200)
committerØyvind Kolås <pippin@gimp.org>
Mon, 27 Aug 2018 22:38:01 +0000 (00:38 +0200)
A test in GEGL relies on this, and keeping zeroed memory zeroed is good
for compression and some other heuristics that might run on a buffer.

babl/base/model-gray.c
babl/base/model-rgb.c
extensions/double.c
extensions/fast-float.c
extensions/float.c
extensions/gegl-fixups.c
extensions/sse2-float.c

index b7d80e1615216ded206bd7682c01876bb437cb03..33df8dcc11bd2eb2c5ef5b955c64e9799c43a405 100644 (file)
@@ -477,6 +477,8 @@ rgba_to_gray_alpha_premultiplied (Babl   *conversion,
           alpha = BABL_ALPHA_FLOOR;
          else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+        if (red == 0.0 && green == 0.0 && blue == 0.0)
+           alpha = 0.0;
       }
 
       luminance = red * RGB_LUMINANCE_RED +
@@ -509,10 +511,20 @@ non_premultiplied_to_premultiplied (Babl  *conversion,
       double alpha = *(double *) src[src_bands-1];
       if (alpha < BABL_ALPHA_FLOOR)
       {
+        int non_zero_components = 0;
         if (alpha >= 0.0f)
           alpha = BABL_ALPHA_FLOOR;
         else if (alpha >= -BABL_ALPHA_FLOOR)
           alpha = -BABL_ALPHA_FLOOR;
+
+        for (band = 0; band < src_bands - 1; band++)
+        {
+          if (*(double *) src[band] != 0.0)
+            non_zero_components++;
+        }
+        if (non_zero_components)
+          alpha = 0.0;
+
       }
 
       for (band = 0; band < src_bands - 1; band++)
@@ -584,6 +596,8 @@ rgba2gray_nonlinear_premultiplied (Babl *conversion,
           alpha = BABL_ALPHA_FLOOR;
         else if (alpha >= -BABL_ALPHA_FLOOR)
           alpha = -BABL_ALPHA_FLOOR;
+        if (red == 0.0 && green == 0.0 && blue == 0.0)
+          alpha = 0.0;
       }
 
       luminance = red * RGB_LUMINANCE_RED +
index c9cd5e046d11bcb5862d9975d803a4d28487e08a..e5d09f91a6a01ab4e99c7deee6667497d96f5e4a 100644 (file)
@@ -327,10 +327,16 @@ non_premultiplied_to_premultiplied (Babl  *conversion,
 
       if (alpha < BABL_ALPHA_FLOOR)
       {
+        int non_zero_components = 0;
         if (alpha >= 0.0)
           alpha = BABL_ALPHA_FLOOR;
         else if (alpha >= -BABL_ALPHA_FLOOR)
           alpha = -BABL_ALPHA_FLOOR;
+        for (band = 0 ; band< src_bands-1; band++)
+          if (*(double *) src[band] != 0.0)
+            non_zero_components++;
+        if (non_zero_components == 0)
+          alpha = 0.0;
       }
 
       for (band = 0; band < src_bands - 1; band++)
@@ -400,6 +406,10 @@ rgba2rgba_nonlinear_premultiplied (Babl *conversion,
            alpha = BABL_ALPHA_FLOOR;
          else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+        if (((double *) src)[0] == 0.0 &&
+            ((double *) src)[1] == 0.0 &&
+            ((double *) src)[2] == 0.0)
+           alpha = 0.0;
       }
 
       ((double *) dst)[0] = babl_trc_from_linear (trc[0], ((double *) src)[0]) * alpha;
@@ -575,6 +585,10 @@ rgba2rgba_perceptual_premultiplied (Babl *conversion,
           alpha = BABL_ALPHA_FLOOR;
         else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+        if (((double *) src)[0] == 0.0 &&
+            ((double *) src)[1] == 0.0 &&
+            ((double *) src)[2] == 0.0)
+           alpha = 0.0;
       }
 
       ((double *) dst)[0] = babl_trc_from_linear (trc, ((double *) src)[0]) * alpha;
index 502a46642b36fef2019df9bc2d0958df8db4716e..7551ab2b67cba1ed0291674957f3ad7199bfb671 100644 (file)
@@ -48,6 +48,10 @@ conv_rgbaD_linear_rgbAD_gamma (const Babl *conversion,unsigned char *src,
            alpha = BABL_ALPHA_FLOOR;
          else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+         if (fsrc[0] == 0.0f &&
+             fsrc[1] == 0.0f &&
+             fsrc[2] == 0.0f)
+           alpha = 0.0f;
        }
        *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha;
        *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha;
index 5540185ba704312cae5c3a0fa7335e68efc00c1b..fcc1b67f352f2f54775ad216f06d3c04c13d372d 100644 (file)
@@ -315,6 +315,8 @@ conv_rgbaF_linear_rgbAF_gamma (const Babl *conversion,unsigned char *src,
              alpha = BABL_ALPHA_FLOOR;
            else if (alpha >= -BABL_ALPHA_FLOOR)
              alpha = -BABL_ALPHA_FLOOR;
+           if (red == 0.0f && green == 0.0f && blue == 0.0f)
+             alpha = 0.0f;
          }
          *fdst++ = linear_to_gamma_2_2_lut (red)   * alpha;
          *fdst++ = linear_to_gamma_2_2_lut (green) * alpha;
index eaa38f51f90d39bc33100e600b2d4128e78d03a4..8ffd7ab0414d2b1d0719c4f55bc3b9402cfe41ea 100644 (file)
@@ -49,6 +49,10 @@ conv_rgbaF_linear_rgbAF_nonlinear (const Babl *conversion,unsigned char *src,
            alpha = BABL_ALPHA_FLOOR;
          else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+         if (fsrc[0] == 0.0f &&
+             fsrc[1] == 0.0f &&
+             fsrc[2] == 0.0f)
+          alpha = 0.0f;
        }
        *fdst++ = babl_trc_from_linear (trc[0], *fsrc++) * alpha;
        *fdst++ = babl_trc_from_linear (trc[1], *fsrc++) * alpha;
@@ -76,6 +80,10 @@ conv_rgbaF_linear_rgbAF_perceptual (const Babl *conversion,unsigned char *src,
            alpha = BABL_ALPHA_FLOOR;
          else if (alpha >= -BABL_ALPHA_FLOOR)
            alpha = -BABL_ALPHA_FLOOR;
+         if (fsrc[0] == 0.0f &&
+             fsrc[1] == 0.0f &&
+             fsrc[2] == 0.0f)
+          alpha = 0.0f;
        }
        *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha;
        *fdst++ = babl_trc_from_linear (trc_srgb, *fsrc++) * alpha;
index 70ef2d306db228ce67937b741a91369a23b6beb0..8a8fe089f3731d759e31607e3d542202d397082b 100644 (file)
@@ -386,6 +386,10 @@ conv_rgbaF_rgbAF (const Babl *conversion,unsigned char *srcc,
           alpha = BABL_ALPHA_FLOOR;
         else if (alpha >= -BABL_ALPHA_FLOOR)
           alpha = -BABL_ALPHA_FLOOR;
+        if (src[0] == 0.0f &&
+            src[1] == 0.0f &&
+            src[2] == 0.0f)
+          alpha = 0.0f;
       }
       dst[0] = src[0] * alpha;
       dst[1] = src[1] * alpha;
index 02a8c2d74e4f99c25096a6aadac6dcee99c77231..24aaa7b0acb71f6910f81e42c61a8e2b8d64ebe8 100644 (file)
@@ -60,6 +60,11 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float *
               ((float *)s)[3] = BABL_ALPHA_FLOOR;
             else
               ((float *)s)[3] = -BABL_ALPHA_FLOOR;
+
+            if (((float *)s)[0] == 0.0f &&
+                ((float *)s)[1] == 0.0f &&
+                ((float *)s)[2] == 0.0f)
+              ((float *)s)[3] = 0.0f;
           }
           if (alpha1 < BABL_ALPHA_FLOOR)
           {
@@ -67,6 +72,10 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float *
               ((float *)s)[7] = BABL_ALPHA_FLOOR;
             else
               ((float *)s)[7] = -BABL_ALPHA_FLOOR;
+            if (((float *)s)[4] == 0.0f &&
+                ((float *)s)[5] == 0.0f &&
+                ((float *)s)[6] == 0.0f)
+              ((float *)s)[7] = 0.0f;
           }
          {
           __v4sf rbaa0, rbaa1;
@@ -109,6 +118,10 @@ conv_rgbaF_linear_rgbAF_linear (const Babl *conversion,const float *src, float *
         a = BABL_ALPHA_FLOOR;
       else if (a >= -BABL_ALPHA_FLOOR)
         a = -BABL_ALPHA_FLOOR;
+      if (src[0] == 0.0f &&
+          src[1] == 0.0f &&
+          src[2] == 0.0f)
+        a = 0.0f;
     }
     dst[0] = src[0] * a;
     dst[1] = src[1] * a;