[babl] extensions/cairo: optimize R'G'B'A u8 to cairo-ARGB32
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] extensions/cairo: optimize R'G'B'A u8 to cairo-ARGB32
- Date: Wed, 4 Apr 2018 22:18:55 +0000 (UTC)
commit ec913afe62437780fac7dbcdbb036958a2b6da91
Author: Øyvind Kolås <pippin gimp org>
Date: Thu Apr 5 00:15:08 2018 +0200
extensions/cairo: optimize R'G'B'A u8 to cairo-ARGB32
A combination of SIMD paths via float was beating the naive implementation in
the cairo extension, now the cairo extension comes out on top again.
extensions/cairo.c | 20 +++++++++-----------
1 files changed, 9 insertions(+), 11 deletions(-)
---
diff --git a/extensions/cairo.c b/extensions/cairo.c
index 114194a..9f7aa37 100644
--- a/extensions/cairo.c
+++ b/extensions/cairo.c
@@ -138,21 +138,19 @@ static void conv_cairo32_rgbAF_premul_le (const Babl *conversion,unsigned char *
}
static inline void
-conv_rgbA8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples)
+conv_rgba8_cairo32_le (const Babl *conversion,unsigned char *src, unsigned char *dst, long samples)
{
long n = samples;
+ uint32_t *dsti = (void*) dst;
while (n--)
{
- unsigned char red = *src++;
- unsigned char green = *src++;
- unsigned char blue = *src++;
- unsigned char alpha = *src++;
-
+ unsigned char alpha = src[3];
#define div_255(a) ((((a)+128)+(((a)+128)>>8))>>8)
- *dst++ = div_255 (blue * alpha);
- *dst++ = div_255 (green * alpha);
- *dst++ = div_255 (red * alpha);
- *dst++ = alpha;
+ *dsti++ = (alpha << 24) +
+ (div_255 (src[0] * alpha) << 16) +
+ (div_255 (src[1] * alpha) << 8) +
+ (div_255 (src[2] * alpha));
+ src+=4;
}
}
@@ -398,7 +396,7 @@ init (void)
conv_rgbA8_premul_cairo32_le, NULL);
babl_conversion_new (babl_format ("R'G'B'A u8"), f32, "linear",
- conv_rgbA8_cairo32_le, NULL);
+ conv_rgba8_cairo32_le, NULL);
babl_conversion_new (babl_format ("R'G'B' u8"), f32, "linear",
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]