cairo: add more little endian conversions
authorØyvind Kolås <pippin@gimp.org>
Mon, 19 Aug 2019 15:40:17 +0000 (17:40 +0200)
committerØyvind Kolås <pippin@gimp.org>
Mon, 19 Aug 2019 15:40:17 +0000 (17:40 +0200)
extensions/cairo.c

index 53e8329a0a04c95930f2b1b520487130ac225440..07a25ff1c1de63141a5edb184fc1f5dcd8537b86 100644 (file)
@@ -204,6 +204,76 @@ conv_cairo32_rgbAF_le (const Babl    *conversion,
     }
 }
 
+
+static void
+conv_cairo32_rgbaF_le (const Babl    *conversion,
+                       unsigned char *src,
+                       unsigned char *dst_char,
+                       long           samples)
+{
+  long n = samples;
+  float *dst = (void*)dst_char;
+  while (n--)
+    {
+      unsigned char blue   = *src++;
+      unsigned char green  = *src++;
+      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;
+    }
+}
+
+
+static void
+conv_cairo24_rgbF_le (const Babl    *conversion,
+                      unsigned char *src,
+                      unsigned char *dst_char,
+                      long           samples)
+{
+  long n = samples;
+  float *dst = (void*)dst_char;
+  while (n--)
+    {
+      unsigned char blue   = *src++;
+      unsigned char green  = *src++;
+      unsigned char red    = *src++;
+
+      *dst++ = red / 255.0;
+      *dst++ = green / 255.0;
+      *dst++ = blue / 255.0;
+      src++;
+    }
+}
+
+static void
+conv_cairo24_cairo32_le (const Babl    *conversion,
+                         unsigned char *src,
+                         unsigned char *dst,
+                         long           samples)
+{
+  long n = samples;
+  while (n--)
+    {
+      unsigned char alpha = src[3];
+
+      *dst++ = (*src++);
+      *dst++ = (*src++);
+      *dst++ = (*src++);
+      *dst++ = 255;  src++;
+    }
+}
+
+
 static void
 conv_rgba8_cairo32_le (const Babl    *conversion,
                        unsigned char *src,
@@ -503,12 +573,21 @@ init (void)
       babl_conversion_new (f32, babl_format ("R'aG'aB'aA float"), "linear",
                            conv_cairo32_rgbAF_le, NULL);
 
+      babl_conversion_new (f32, babl_format ("R'G'B'A float"), "linear",
+                           conv_cairo32_rgbaF_le, NULL);
+
       babl_conversion_new (f32, babl_format ("R'aG'aB'aA u8"), "linear",
                            conv_cairo32_rgbA8_le, NULL);
 
       babl_conversion_new (f32, babl_format ("R'G'B'A u8"), "linear",
                            conv_cairo32_rgba8_le, NULL);
 
+      babl_conversion_new (f24, f32, "linear",
+                           conv_cairo24_cairo32_le, NULL);
+
+      babl_conversion_new (f24, babl_format ("R'G'B' float"), "linear",
+                           conv_cairo24_rgbF_le, NULL);
+
       babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear",
                            conv_rgbA8_cairo32_le, NULL);