diff options
author | Øyvind Kolås <pippin@gimp.org> | 2019-08-19 02:57:47 +0200 |
---|---|---|
committer | Øyvind Kolås <pippin@gimp.org> | 2019-08-19 03:17:28 +0200 |
commit | ecfe0c8566e9f9f3a9b7e7b186758de901c22bfc (patch) | |
tree | 60e88497481faa814117fde9125265e58d45f1eb /extensions | |
parent | 7084fc49bb78c9ea9df354498fda62cded557ee6 (diff) |
extensions: add some u8 and u16 conversions for grayscale
This adds some missing end pieces for building much better than reference
conversions for many useful u8 and u16 code paths.
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/simple.c | 254 |
1 files changed, 240 insertions, 14 deletions
diff --git a/extensions/simple.c b/extensions/simple.c index 617e369..627247a 100644 --- a/extensions/simple.c +++ b/extensions/simple.c @@ -142,13 +142,6 @@ float_pre_to_u16_pre (const Babl *conversion, float b = src[2]; float a = src[3]; - if (a > 1.0f) { - r /= a; - g /= a; - b /= a; - a /= a; - } - dst[0] = (r >= 1.0f) ? 0xFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFF * r + 0.5f); dst[1] = (g >= 1.0f) ? 0xFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFF * g + 0.5f); dst[2] = (b >= 1.0f) ? 0xFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFF * b + 0.5f); @@ -175,13 +168,6 @@ float_pre_to_u32_pre (const Babl *conversion, float b = src[2]; float a = src[3]; - if (a > 1.0f) { - r /= a; - g /= a; - b /= a; - a /= a; - } - dst[0] = (r >= 1.0f) ? 0xFFFFFFFF : ((r <= 0.0f) ? 0x0 : 0xFFFFFFFF * r + 0.5f); dst[1] = (g >= 1.0f) ? 0xFFFFFFFF : ((g <= 0.0f) ? 0x0 : 0xFFFFFFFF * g + 0.5f); dst[2] = (b >= 1.0f) ? 0xFFFFFFFF : ((b <= 0.0f) ? 0x0 : 0xFFFFFFFF * b + 0.5f); @@ -350,6 +336,146 @@ yau16_rgbaf (const Babl *conversion, } +static inline void +u8_to_float (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + float *dst = (float *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0] / 255.0f; + dst ++; + src ++; + } +} + +static void +u8_to_float_x4 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 4); +} + +static void +u8_to_float_x3 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 3); +} + + +static void +u8_to_float_x2 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + u8_to_float (conversion, src_char, dst_char, samples * 2); +} + +static inline void +yau8_rgbaf (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + float *dst = (float *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0] / 255.0f; + dst[1] = src[0] / 255.0f; + dst[2] = src[0] / 255.0f; + dst[3] = src[1] / 255.0f; + dst +=4; + src +=2; + } +} + + +static inline void +yu8_yau8 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + uint8_t *dst = (uint8_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst[1] = 255; + dst += 2; + src += 1; + } +} + + +static inline void +yau8_yu8 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint8_t *src = (uint8_t *)src_char; + uint8_t *dst = (uint8_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst += 1; + src += 2; + } +} + + + +static inline void +yu16_yau16 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint16_t *src = (uint16_t *)src_char; + uint16_t *dst = (uint16_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst[1] = 65535; + dst += 2; + src += 1; + } +} + +static inline void +yau16_yu16 (const Babl *conversion, + unsigned char *src_char, + unsigned char *dst_char, + long samples) +{ + uint16_t *src = (uint16_t *)src_char; + uint16_t *dst = (uint16_t *)dst_char; + long n = samples; + while (n--) + { + dst[0] = src[0]; + dst += 1; + src += 2; + } +} + + int init (void) { @@ -600,5 +726,105 @@ init (void) "linear", yau16_rgbaf, NULL); + + + babl_conversion_new (babl_format ("YA u8"), + babl_format ("YA float"), + "linear", + u8_to_float_x2, + NULL); + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("Y'A float"), + "linear", + u8_to_float_x2, + NULL); + babl_conversion_new (babl_format ("Y u8"), + babl_format ("Y float"), + "linear", + u8_to_float, + NULL); + babl_conversion_new (babl_format ("Y' u8"), + babl_format ("Y' float"), + "linear", + u8_to_float, + NULL); + babl_conversion_new (babl_format ("RGBA u8"), + babl_format ("RGBA float"), + "linear", + u8_to_float_x4, + NULL); + babl_conversion_new (babl_format ("R'G'B'A u8"), + babl_format ("R'G'B'A float"), + "linear", + u8_to_float_x4, + NULL); + + babl_conversion_new (babl_format ("RGB u8"), + babl_format ("RGB float"), + "linear", + u8_to_float_x3, + NULL); + babl_conversion_new (babl_format ("R'G'B' u8"), + babl_format ("R'G'B' float"), + "linear", + u8_to_float_x3, + NULL); + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("R'G'B'A float"), + "linear", + yau8_rgbaf, + NULL); + + + babl_conversion_new (babl_format ("Y' u8"), + babl_format ("Y'A u8"), + "linear", + yu8_yau8, + NULL); + + babl_conversion_new (babl_format ("Y u8"), + babl_format ("YA u8"), + "linear", + yu8_yau8, + NULL); + + babl_conversion_new (babl_format ("Y' u16"), + babl_format ("Y'A u16"), + "linear", + yu16_yau16, + NULL); + + babl_conversion_new (babl_format ("Y u16"), + babl_format ("YA u16"), + "linear", + yu16_yau16, + NULL); + + + babl_conversion_new (babl_format ("Y'A u8"), + babl_format ("Y' u8"), + "linear", + yau8_yu8, + NULL); + + babl_conversion_new (babl_format ("YA u8"), + babl_format ("Y u8"), + "linear", + yau8_yu8, + NULL); + + babl_conversion_new (babl_format ("Y'A u16"), + babl_format ("Y' u16"), + "linear", + yau16_yu16, + NULL); + + babl_conversion_new (babl_format ("YA u16"), + babl_format ("Y u16"), + "linear", + yau16_yu16, + NULL); + + return 0; } |