[babl] extensions: add two fast paths from cairo formats



commit 6c4592c40cb3652af3a2eeb0c06f3fd9f974f918
Author: Øyvind Kolås <pippin gimp org>
Date:   Mon May 15 22:05:21 2017 +0200

    extensions: add two fast paths from cairo formats
    
    This is to babls corresponding premultiplied but in different swizzling order
    8bit and float data.

 extensions/cairo.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)
---
diff --git a/extensions/cairo.c b/extensions/cairo.c
index 5569ab6..6066258 100644
--- a/extensions/cairo.c
+++ b/extensions/cairo.c
@@ -104,6 +104,43 @@ conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long sampl
 }
 #endif
 
+static long conv_cairo32_rgbA8_premul_le (unsigned char *src, unsigned char *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;
+    }
+  return samples;
+}
+
+
+static long conv_cairo32_rgbAF_premul_le (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++;
+
+      *dst++ = red / 255.0;
+      *dst++ = green / 255.0;
+      *dst++ = blue / 255.0;
+      *dst++ = alpha / 255.0;
+    }
+  return samples;
+}
 
 static inline long
 conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples)
@@ -359,6 +396,13 @@ init (void)
         babl_component ("PAD"),
         NULL
       );
+
+      babl_conversion_new (f32, babl_format ("R'aG'aB'aA float"), "linear", 
+                           conv_cairo32_rgbAF_premul_le, NULL);
+
+      babl_conversion_new (f32, babl_format ("R'aG'aB'aA u8"), "linear", 
+                           conv_cairo32_rgbA8_premul_le, NULL);
+
       babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear", 
                            conv_rgbA8_premul_cairo32_le, NULL);
 


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