From: Øyvind Kolås Date: Mon, 15 May 2017 20:05:21 +0000 (+0200) Subject: extensions: add two fast paths from cairo formats X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~15^2~21^2~256 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6c4592c40cb3652af3a2eeb0c06f3fd9f974f918;p=babl.git extensions: add two fast paths from cairo formats This is to babls corresponding premultiplied but in different swizzling order 8bit and float data. --- 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);