[babl] babl: lut, tidy u8 code - disable u16/half variant



commit 4f83dbf8a89f7c9a5e2a1754980b702de23380aa
Author: Øyvind Kolås <pippin gimp org>
Date:   Mon Jan 24 01:57:20 2022 +0100

    babl: lut, tidy u8 code - disable u16/half variant

 babl/babl-fish-path.c | 61 +++++++++++++++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 21 deletions(-)
---
diff --git a/babl/babl-fish-path.c b/babl/babl-fish-path.c
index 7d9e825..52e89a4 100644
--- a/babl/babl-fish-path.c
+++ b/babl/babl-fish-path.c
@@ -656,8 +656,11 @@ babl_fish_path2 (const Babl *source,
   if (source->format.space != destination->format.space &&
      (source->format.model->flags & BABL_MODEL_FLAG_ASSOCIATED)==0  &&
      (
-      (babl->fish_path.source_bpp == 4 && babl->fish_path.dest_bpp == 4) ||
-      (babl->fish_path.source_bpp == 8 && babl->fish_path.dest_bpp == 4))
+      (babl->fish_path.source_bpp == 4 && babl->fish_path.dest_bpp == 4)
+      // XXX 16bit code paths not enabled yet.
+      //
+      //|| (babl->fish_path.source_bpp == 8 && babl->fish_path.dest_bpp == 4)
+      )
      )
   {
      if ((source->format.model->flags & BABL_MODEL_FLAG_ASSOCIATED)==0)
@@ -719,8 +722,15 @@ babl_fish_path_process (const Babl *babl,
   {
      uint32_t *lut = (uint32_t*)babl->fish_path.u8_lut;
      ((Babl*)babl)->fish.pixels += n;
+
+
      if (!lut && babl->fish.pixels > 256 * 128)
      {
+#if 0
+       fprintf (stderr, "building LUT for %s to %s\n",
+                        babl_get_name (babl->conversion.source),
+                        babl_get_name (babl->conversion.destination));
+#endif
        lut = malloc (256 * 256 * 256 * 4);
        if (babl->fish_path.source_bpp == 8)
        {
@@ -728,14 +738,21 @@ babl_fish_path_process (const Babl *babl,
           for (int o = 0; o < 256 * 256 * 256; o++)
           {
             uint64_t v = o;
-            int v0 =     v & 0xff;
-            int v1 =   v & 0xff00;
-            int v2 = v & 0xff0000;
-            v0 <<= 8;
-            v1 <<= 16;
-            v2 <<= 24;
-            v = v0||v1||v2;
-            lut_in[o] = v | (uint64_t)0xffff000000000000;
+            uint64_t v0 =       v & 0xff;
+            uint64_t v1 =   (v & 0xff00) >> 8;
+            uint64_t v2 = (v & 0xff0000) >> 16;
+
+#if 1
+            // gives same results... but purer white is better?
+            v0 = (v0 <<  8) | (((v0&1)?0xff:0)<<0);
+            v1 = (v1 << 24) | (((v1&1)?(uint64_t)0xff:0)<<16);
+            v2 = (v2 << 40) | (((v2&1)?(uint64_t)0xff:0)<<32);
+#else
+            v0 = (v0 <<  8);
+            v1 = (v1 << 24);
+            v2 = (v2 << 40);
+#endif
+            lut_in[o] = v;
           }
 
           process_conversion_path (babl->fish_path.conversion_list,
@@ -749,7 +766,7 @@ babl_fish_path_process (const Babl *babl,
        else
        {
        for (int o = 0; o < 256 * 256 * 256; o++)
-         lut[o] = o | 0xff000000;
+         lut[o] = o;
        process_conversion_path (babl->fish_path.conversion_list,
                                 lut,
                                 babl->fish_path.source_bpp,
@@ -772,8 +789,9 @@ babl_fish_path_process (const Babl *babl,
      }
      if (lut)
      {
-        if (babl->fish_path.source_bpp == 8)
-        {
+        if (babl->fish_path.source_bpp == 8) // 16 bit, not working yet
+        {                                    // half and u16 need their
+                                             // own separate handling
           uint32_t *src = (uint32_t*)source;
           uint32_t *dst = (uint32_t*)destination;
           lut = (uint32_t*)babl->fish_path.u8_lut;
@@ -781,13 +799,15 @@ babl_fish_path_process (const Babl *babl,
           {
              uint32_t col_a = *src++;
              uint32_t col_b = *src++;
-             uint32_t col, alpha;
-             col_a = col_a & 0xff00ff00;
-             col_b = (col_b & 0xff00ff00)>>8;
+             uint32_t col;
+
+             uint32_t c_ar = ((col_a & 0xff000000)|
+                             ((col_a & 0x0000ff00) << 8));
+             uint32_t c_gb = ((col_b & 0xff000000)|
+                             ((col_b & 0x0000ff00) << 8))>>16;
+             col = c_ar|c_gb;
 
-             col = col_a | col_b;
-             alpha = col & 0xff000000;
-             *dst++ = lut[col & 0xffffff] | alpha;
+             *dst++ = lut[col & 0xffffff] | (col & 0xff000000);
           }
         }
         else
@@ -798,8 +818,7 @@ babl_fish_path_process (const Babl *babl,
           while (n--)
           {
              uint32_t col = *src++;
-             uint32_t alpha = col & 0xff000000;
-             *dst++ = lut[col & 0xffffff] | alpha;
+             *dst++ = lut[col & 0xffffff] | (col & 0xff000000);
           }
         }
         return;


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