[babl] extensions/gimp-8bit: use RGB space TRCs



commit 5a7c36935738d491058cb7bc8a527bc9ba15c7b4
Author: Øyvind Kolås <pippin gimp org>
Date:   Wed Aug 30 01:35:20 2017 +0200

    extensions/gimp-8bit: use RGB space TRCs

 extensions/gimp-8bit.c |   60 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 42 insertions(+), 18 deletions(-)
---
diff --git a/extensions/gimp-8bit.c b/extensions/gimp-8bit.c
index 92e3d6e..3b66364 100644
--- a/extensions/gimp-8bit.c
+++ b/extensions/gimp-8bit.c
@@ -22,7 +22,7 @@
 #include "config.h"
 #include <stdio.h>
 
-#include "babl.h"
+#include "babl-internal.h"
 
 #include "base/util.h"
 #include "extensions/util.h"
@@ -32,23 +32,41 @@
 
 /* lookup tables used in conversion */
 
+#define MAX_SPACES 32
+static const Babl *spaces[MAX_SPACES]={NULL,};
+
 static float lut_linear[1 << 8];
-static float lut_gamma_2_2[1 << 8];
+static float lut_gamma_2_2[MAX_SPACES][1 << 8];
 
 
-static void
-tables_init (void)
+static int
+tables_init (const Babl *space)
 {
-  int i;
+  int i, j;
+
+  for (j = 0; spaces[j]; j++)
+  {
+    if (spaces[j] == space)
+      return j;
+  }
+  spaces[j] = space;
 
   /* fill tables for conversion from 8 bit integer to float */
+  if (j == 0)
   for (i = 0; i < 1 << 8; i++)
     {
       double value = i / 255.0;
-
       lut_linear[i]    = value;
-      lut_gamma_2_2[i] = gamma_2_2_to_linear (value);
     }
+
+  /* fill tables for conversion from 8 bit integer to float */
+  for (i = 0; i < 1 << 8; i++)
+    {
+      double value = i / 255.0;
+      lut_gamma_2_2[j][i] = _babl_trc_to_linear (space->space.trc[0], value);
+    }
+
+  return j;
 }
 
 static INLINE long
@@ -92,11 +110,12 @@ u8_gamma_2_2_to_float_linear (const Babl *conversion,unsigned char *src,
                               unsigned char *dst,
                               long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
-    *d++ = lut_gamma_2_2[*src++];
+    *d++ = lut_gamma_2_2[space_no][*src++];
 
   return samples;
 }
@@ -127,14 +146,15 @@ conv_rgba8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src,
                                    unsigned char *dst,
                                    long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
     {
-      *d++ = lut_gamma_2_2[*src++];
-      *d++ = lut_gamma_2_2[*src++];
-      *d++ = lut_gamma_2_2[*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
       *d++ = lut_linear[*src++];
     }
 
@@ -187,14 +207,15 @@ conv_rgb8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src,
                                   unsigned char *dst,
                                   long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
     {
-      *d++ = lut_gamma_2_2[*src++];
-      *d++ = lut_gamma_2_2[*src++];
-      *d++ = lut_gamma_2_2[*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
       *d++ = 1.0;
     }
 
@@ -216,12 +237,13 @@ conv_ga8_gamma_2_2_gaF_linear (const Babl *conversion,unsigned char *src,
                                unsigned char *dst,
                                long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
     {
-      *d++ = lut_gamma_2_2[*src++];
+      *d++ = lut_gamma_2_2[space_no][*src++];
       *d++ = lut_linear[*src++];
     }
 
@@ -272,12 +294,13 @@ conv_ga8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src,
                                  unsigned char *dst,
                                  long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
     {
-      float value = lut_gamma_2_2[*src++];
+      float value = lut_gamma_2_2[space_no][*src++];
 
       *d++ = value;
       *d++ = value;
@@ -333,12 +356,13 @@ conv_g8_gamma_2_2_rgbaF_linear (const Babl *conversion,unsigned char *src,
                                 unsigned char *dst,
                                 long           samples)
 {
+  int   space_no = tables_init (conversion->conversion.source->format.space);
   float *d = (float *) dst;
   long   n = samples;
 
   while (n--)
     {
-      float value = lut_gamma_2_2[*src++];
+      float value = lut_gamma_2_2[space_no][*src++];
 
       *d++ = value;
       *d++ = value;
@@ -494,7 +518,7 @@ init (void)
     babl_component ("Y'"),
     NULL);
 
-  tables_init ();
+  tables_init (babl_space("sRGB"));
 
 #define o(src, dst) \
   babl_conversion_new (src, dst, "linear", conv_ ## src ## _ ## dst, NULL)


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