[babl] babl: preliminary work to add float fast path to palette formats
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] babl: preliminary work to add float fast path to palette formats
- Date: Wed, 16 May 2018 11:14:31 +0000 (UTC)
commit 9596cfe90b684f08abf678bcd0f7d6f13866ca6e
Author: Øyvind Kolås <pippin gimp org>
Date: Wed May 16 13:13:26 2018 +0200
babl: preliminary work to add float fast path to palette formats
Still not accurate enough to be acceptable, gets accepted by system with
a BABL_TOLERANCe of 0.045 or higher. Needs more work.
babl/babl-palette.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 97 insertions(+), 0 deletions(-)
---
diff --git a/babl/babl-palette.c b/babl/babl-palette.c
index 7a06e7d..1cc9758 100644
--- a/babl/babl-palette.c
+++ b/babl/babl-palette.c
@@ -341,6 +341,90 @@ rgba_u8_to_pal (Babl *conversion,
}
static void
+rgba_float_to_pal_a (Babl *conversion,
+ unsigned char *src_b,
+ unsigned char *dst,
+ long n,
+ void *src_model_data)
+{
+ BablPalette **palptr = src_model_data;
+ BablPalette *pal;
+ assert (palptr);
+ pal = *palptr;
+ assert(pal);
+ while (n--)
+ {
+ float *src_f = (void*) src_b;
+ unsigned char src[4];
+ int c;
+ for (c = 0; c < 3; c++)
+ {
+ if (src_f[c] >= 1.0f)
+ src[c] = 255;
+ else if (src_f[c] <= 0.0f)
+ src[c] = 0;
+ else
+ src[c] = src_f[c] * 255 + 0.5f;
+ }
+ if (src_f[3] >= 1.0f)
+ src[3] = 255;
+ else if (src_f[3] <= 0.0f)
+ src[3] = 0;
+ else
+ src[3] = src_f[3] * 255 + 0.5f;
+
+
+ dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
+ dst[1] = src[3];
+
+ src_b += sizeof (float) * 4;
+ dst += sizeof (char) * 2;
+ }
+}
+
+
+static void
+rgba_float_to_pal (Babl *conversion,
+ unsigned char *src_b,
+ unsigned char *dst,
+ long n,
+ void *src_model_data)
+{
+ const Babl *space = babl_conversion_get_source_space (conversion);
+ BablPalette **palptr = src_model_data;
+ BablPalette *pal;
+ assert (palptr);
+ pal = *palptr;
+ assert(pal);
+ while (n--)
+ {
+ float *src_f = (void*) src_b;
+ unsigned char src[4];
+ int c;
+ for (c = 0; c < 3; c++)
+ {
+ if (src_f[c] >= 1.0f)
+ src[c] = 255;
+ else if (src_f[c] <= 0.0f)
+ src[c] = 0;
+ else
+ src[c] = src_f[c] * 255 + 0.5f;
+ }
+ if (src_f[3] >= 1.0f)
+ src[3] = 255;
+ else if (src_f[3] <= 0.0f)
+ src[3] = 0;
+ else
+ src[3] = src_f[3] * 255 + 0.5f;
+
+ dst[0] = babl_palette_lookup (pal, src[0], src[1], src[2], src[3]);
+
+ src_b += sizeof (float) * 4;
+ dst += sizeof (char) * 1;
+ }
+}
+
+static void
rgba_u8_to_pal_a (Babl *conversion,
unsigned char *src,
unsigned char *dst,
@@ -602,6 +686,19 @@ const Babl *babl_new_palette (const char *name,
"data", palptr,
NULL);
+ babl_conversion_new (
+ babl_format ("R'G'B'A float"),
+ f_pal_a_u8,
+ "linear", rgba_float_to_pal_a,
+ "data", palptr,
+ NULL);
+ babl_conversion_new (
+ babl_format ("R'G'B'A float"),
+ f_pal_u8,
+ "linear", rgba_float_to_pal,
+ "data", palptr,
+ NULL);
+
babl_set_user_data (model, palptr);
babl_set_user_data (model_no_alpha, palptr);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]