[babl] extensions: cairo remove a broken conversion, fix RGBA u8 to cairo reference



commit 3871e1819fe07ae64ddc3c19fc9f2bd478b02b9b
Author: Øyvind Kolås <pippin gimp org>
Date:   Sun Jan 23 00:54:20 2022 +0100

    extensions: cairo remove a broken conversion, fix RGBA u8 to cairo reference

 extensions/cairo.c | 90 ++++++++++++++++--------------------------------------
 1 file changed, 26 insertions(+), 64 deletions(-)
---
diff --git a/extensions/cairo.c b/extensions/cairo.c
index 3af4a9bd3..1330fe458 100644
--- a/extensions/cairo.c
+++ b/extensions/cairo.c
@@ -113,27 +113,6 @@ conv_rgbA8_cairo32_le (const Babl    *conversion,
 }
 #endif
 
-static void
-conv_cairo32_rgbA8_le (const Babl    *conversion,
-                       unsigned char *__restrict__ src,
-                       unsigned char *__restrict__ dst,
-                       long           samples)
-{
-  long n = samples;
-  while (n--)
-    {
-      unsigned char blue   = *src++;
-      unsigned char green  = *src++;
-      unsigned char red    = *src++;
-      unsigned char alpha  = *src++;
-
-      *dst++ = red;
-      *dst++ = green;
-      *dst++ = blue;
-      *dst++ = alpha;
-    }
-}
-
 static void 
 conv_cairo32_rgba8_le (const Babl    *conversion,
                        unsigned char *__restrict__ src, 
@@ -165,17 +144,9 @@ conv_cairo32_rgba8_le (const Babl    *conversion,
       else
       {
         float falpha = alpha / 255.0;
-        float recip_alpha = 1.0 / falpha;
- //       unsigned int aa = ((255 << 16) + alpha) / falpha + 0.5;
-
-
-        *dst++ = ((red/255.0) * recip_alpha) * 255 + 0.5f;
-        *dst++ = ((green/255.0) * recip_alpha) * 255 + 0.5f;
-        *dst++ = ((blue/255.0) * recip_alpha) * 255 + 0.5f;
-
-//        *dst++ = (red   * aa + 0x8000) >> 16;
-//        *dst++ = (green * aa + 0x8000) >> 16;
-//        *dst++ = (blue  * aa + 0x8000) >> 16;
+        *dst++ = red / falpha + 0.5;
+        *dst++ = green / falpha + 0.5;
+        *dst++ = blue / falpha + 0.5;
         *dst++ = alpha;
       }
     }
@@ -183,13 +154,12 @@ conv_cairo32_rgba8_le (const Babl    *conversion,
 
 
 static void
-conv_cairo32_rgbAF_le (const Babl    *conversion,
+conv_cairo32_rgbA8_le (const Babl    *conversion,
                        unsigned char *__restrict__ src,
-                       unsigned char *__restrict__ dst_char,
+                       unsigned char *__restrict__ dst,
                        long           samples)
 {
   long n = samples;
-  float *dst = (void*)dst_char;
   while (n--)
     {
       unsigned char blue   = *src++;
@@ -197,16 +167,16 @@ conv_cairo32_rgbAF_le (const Babl    *conversion,
       unsigned char red    = *src++;
       unsigned char alpha  = *src++;
 
-      *dst++ = red / 255.0;
-      *dst++ = green / 255.0;
-      *dst++ = blue / 255.0;
-      *dst++ = alpha / 255.0;
+      *dst++ = red;
+      *dst++ = green;
+      *dst++ = blue;
+      *dst++ = alpha;
     }
 }
 
 
 static void
-conv_cairo32_rgbaF_le (const Babl    *conversion,
+conv_cairo32_rgbAF_le (const Babl    *conversion,
                        unsigned char *__restrict__ src,
                        unsigned char *__restrict__ dst_char,
                        long           samples)
@@ -220,20 +190,13 @@ conv_cairo32_rgbaF_le (const Babl    *conversion,
       unsigned char red    = *src++;
       unsigned char alpha  = *src++;
 
-      float reciprocal_alpha = 0.0f;
-
-      if (alpha)
-        reciprocal_alpha = 1.0f/(alpha/255.0f) / 255.0f;
-      
-
-      *dst++ = red * reciprocal_alpha;
-      *dst++ = green * reciprocal_alpha;
-      *dst++ = blue * reciprocal_alpha;
-      *dst++ = alpha / 255.0;
+      *dst++ = red / 255.0f;
+      *dst++ = green / 255.0f;
+      *dst++ = blue / 255.0f;
+      *dst++ = alpha / 255.0f;
     }
 }
 
-
 static void
 conv_cairo24_cairo32_le (const Babl    *conversion,
                          unsigned char *__restrict__ src,
@@ -410,7 +373,7 @@ conv_rgbA_gamma_float_cairo32_le (const Babl    *conversion,
 
   while (n--)
     {
-      int val = fsrc[2] * 255.0f  + 0.5f;
+      int val = fsrc[2] * 255.0f + 0.5f;
       *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
       val = fsrc[1] * 255.0f + 0.5f;
       *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
@@ -443,11 +406,11 @@ conv_rgbafloat_cairo32_le (const Babl    *conversion,
       float alpha  = *fsrc++;
       if (alpha >= 1.0)
       {
-        int val = babl_trc_from_linear (trc[2], blue) * 0xff + 0.5f;
+        int val = babl_trc_from_linear (trc[2], blue) * 0xff + .0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-        val = babl_trc_from_linear (trc[1], green) * 0xff + 0.5f;
+        val = babl_trc_from_linear (trc[1], green) * 0xff + .0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-        val = babl_trc_from_linear (trc[0], red) * 0xff + 0.5f;
+        val = babl_trc_from_linear (trc[0], red) * 0xff + .0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
         *cdst++ = 0xff;
       }
@@ -459,13 +422,15 @@ conv_rgbafloat_cairo32_le (const Babl    *conversion,
       else
       {
         float balpha = alpha * 0xff;
-        int val = babl_trc_from_linear (trc[2], blue) * balpha + 0.5f;
+        int val = babl_trc_from_linear (trc[2], blue) * balpha + 0.0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-        val = babl_trc_from_linear (trc[1], green) * balpha + 0.5f;
+        val = babl_trc_from_linear (trc[1], green) * balpha + 0.0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-        val = babl_trc_from_linear (trc[0], red) * balpha + 0.5f;
+        val = babl_trc_from_linear (trc[0], red) * balpha + 0.0;
         *cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-        *cdst++ = balpha + 0.5f;
+        balpha+=0.0;
+        if (balpha > 255)balpha=255;
+        *cdst++ = balpha;
       }
     }
 }
@@ -489,7 +454,7 @@ conv_yafloat_cairo32_le (const Babl    *conversion,
       float alpha  = *fsrc++;
       if (alpha >= 1.0)
       {
-        int val = babl_trc_from_linear (trc[0], gray) * 0xff + 0.5f;
+        int val = babl_trc_from_linear (trc[0], gray) * 0xff;
         val = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
         *cdst++ = val;
         *cdst++ = val;
@@ -531,7 +496,7 @@ conv_yafloat_nl_cairo32_le (const Babl    *conversion,
       float alpha  = *fsrc++;
       if (alpha >= 1.0)
       {
-        int val = gray * 0xff + 0.5f;
+        int val = gray * 0xff;
         val = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
         *cdst++ = val;
         *cdst++ = val;
@@ -603,9 +568,6 @@ init (void)
                            conv_cairo32_rgba8_le, NULL);
 
 
-      babl_conversion_new (f32, babl_format ("R'G'B'A float"), "linear",
-                           conv_cairo32_rgbaF_le, NULL);
-
       babl_conversion_new (f24, f32, "linear",
                            conv_cairo24_cairo32_le, NULL);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]