oklab: add to meson, register model conversions
authorØyvind Kolås <pippin@gimp.org>
Thu, 28 Oct 2021 21:50:14 +0000 (23:50 +0200)
committerØyvind Kolås <pippin@gimp.org>
Thu, 28 Oct 2021 21:56:50 +0000 (23:56 +0200)
extensions/meson.build
extensions/oklab.c

index 598857c0d9efb1ef4e79847cc03faafb599fd2e6..df75a236922428105012b12860cea7bac778f927 100644 (file)
@@ -26,6 +26,7 @@ extensions = [
   ['u16', no_cflags],
   ['u32', no_cflags],
   ['cairo', no_cflags],
+  ['oklab', no_cflags],
   ['CIE', sse2_cflags],
   ['double', no_cflags],
   ['fast-float', no_cflags],
index 24326d57781502aee1693eac0be4bf339b55999b..e94c611ee0ee7aac6e7d737a2e2df6ce457a0fbe 100644 (file)
@@ -142,15 +142,15 @@ formats (void)
 /* It's all float. The original definition is in float. */\r
 static double M1[9] = {\r
   +0.8189330101, +0.0329845436, +0.0482003018,\r
-  ​+0.3618667424, ​+0.9293118715, +0.2643662691,\r
-  -0.1288597137, +0.0361456387, +0.6338517070,\r
-}\r
+  +0.3618667424, +0.9293118715, +0.2643662691,\r
+  -0.1288597137, +0.0361456387, +0.6338517070,\r
+};\r
 \r
 static double M2[9] = {\r
   +0.2104542553, +0.7936177850, - 0.0040720468,\r
   +1.9779984951, -2.4285922050, + 0.4505937099,\r
   +0.0259040371, +0.7827717662, - 0.8086757660,\r
-}\r
+};\r
 \r
 static float M1f[9];\r
 static float M2f[9];\r
@@ -228,7 +228,7 @@ ch_to_ab_step (float *ch, float *ab_out)
 }\r
 \r
 static inline void\r
-xyz_to_Oklch_step (float *xyz, float *lch_out)\r
+XYZ_to_Oklch_step (float *xyz, float *lch_out)\r
 {\r
   XYZ_to_Oklab_step (xyz, lch_out);\r
   ab_to_ch_step (lch_out + 1, lch_out + 1);\r
@@ -243,14 +243,15 @@ Oklch_to_XYZ_step (float *lch, float *xyz_out)
 }\r
 \r
 static inline void\r
-constants ()\r
+constants (void)\r
 {\r
-  if (mat_ready)\r
-    return;\r
-\r
   double tmp[9];\r
   double D65[3] = { 0.95047, 1.0, 1.08883 };\r
   double D50[3] = { 0.96420288, 1.0, 0.82490540 };\r
+\r
+  if (mat_ready)\r
+    return;\r
+\r
   babl_chromatic_adaptation_matrix (D50, D65, tmp);\r
   babl_matrix_mul_matrix (tmp, M1, M1);\r
 \r
@@ -270,7 +271,7 @@ static void
 rgba_to_laba (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
-  +float *src = (float *)src_, *dst = (float *)dst_;\r
+  float *src = (float *)src_, *dst = (float *)dst_;\r
   const Babl *space = babl_conversion_get_source_space (conversion);\r
 \r
   while (n--)\r
@@ -286,7 +287,7 @@ rgba_to_laba (const Babl *conversion, char *src_, char *dst_, long samples)
 }\r
 \r
 static void\r
-rgba_to_lcha (const Babl *conversion, char *src_, char *dst_, long samples)\r
+rgba_to_lab (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -296,16 +297,15 @@ rgba_to_lcha (const Babl *conversion, char *src_, char *dst_, long samples)
     {\r
       float xyz[3];\r
       babl_space_to_xyzf (space, src, xyz);\r
-      XYZ_to_Oklch_step (xyz, dst);\r
-      dst[3] = src[3];\r
+      XYZ_to_Oklab_step (xyz, dst);\r
 \r
       src += 4;\r
-      dst += 4;\r
+      dst += 3;\r
     }\r
 }\r
 \r
 static void\r
-rgb_to_lab (const Babl *conversion, char *src_, char *dst_, long samples)\r
+rgba_to_lcha (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -315,15 +315,16 @@ rgb_to_lab (const Babl *conversion, char *src_, char *dst_, long samples)
     {\r
       float xyz[3];\r
       babl_space_to_xyzf (space, src, xyz);\r
-      XYZ_to_Oklab_step (xyz, dst);\r
+      XYZ_to_Oklch_step (xyz, dst);\r
+      dst[3] = src[3];\r
 \r
-      src += 3;\r
-      dst += 3;\r
+      src += 4;\r
+      dst += 4;\r
     }\r
 }\r
 \r
 static void\r
-rgb_to_lch (const Babl *conversion, char *src_, char *dst_, long samples)\r
+rgba_to_lch (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -335,13 +336,13 @@ rgb_to_lch (const Babl *conversion, char *src_, char *dst_, long samples)
       babl_space_to_xyzf (space, src, xyz);\r
       XYZ_to_Oklch_step (xyz, dst);\r
 \r
-      src += 3;\r
+      src += 4;\r
       dst += 3;\r
     }\r
 }\r
 \r
 static void\r
-lab_to_rgb (const Babl *conversion, char *src_, char *dst_, long samples)\r
+lab_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -352,14 +353,15 @@ lab_to_rgb (const Babl *conversion, char *src_, char *dst_, long samples)
       float xyz[3];\r
       Oklab_to_XYZ_step (src, xyz);\r
       babl_space_from_xyzf (space, xyz, dst);\r
+      dst[3] = 1.0;\r
 \r
       src += 3;\r
-      dst += 3;\r
+      dst += 4;\r
     }\r
 }\r
 \r
 static void\r
-lch_to_rgb (const Babl *conversion, char *src_, char *dst_, long samples)\r
+laba_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -368,16 +370,17 @@ lch_to_rgb (const Babl *conversion, char *src_, char *dst_, long samples)
   while (n--)\r
     {\r
       float xyz[3];\r
-      Oklch_to_XYZ_step (src, xyz);\r
+      Oklab_to_XYZ_step (src, xyz);\r
       babl_space_from_xyzf (space, xyz, dst);\r
+      dst[3] = src[3];\r
 \r
-      src += 3;\r
-      dst += 3;\r
+      src += 4;\r
+      dst += 4;\r
     }\r
 }\r
 \r
 static void\r
-laba_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
+lcha_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -386,7 +389,7 @@ laba_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)
   while (n--)\r
     {\r
       float xyz[3];\r
-      Oklab_to_XYZ_step (src, xyz);\r
+      Oklch_to_XYZ_step (src, xyz);\r
       babl_space_from_xyzf (space, xyz, dst);\r
       dst[3] = src[3];\r
 \r
@@ -396,7 +399,7 @@ laba_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)
 }\r
 \r
 static void\r
-lcha_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
+lch_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)\r
 {\r
   long n = samples;\r
   float *src = (float *)src_, *dst = (float *)dst_;\r
@@ -407,9 +410,9 @@ lcha_to_rgba (const Babl *conversion, char *src_, char *dst_, long samples)
       float xyz[3];\r
       Oklch_to_XYZ_step (src, xyz);\r
       babl_space_from_xyzf (space, xyz, dst);\r
-      dst[3] = src[3];\r
+      dst[3] = 1.0f;\r
 \r
-      src += 4;\r
+      src += 3;\r
       dst += 4;\r
     }\r
 }\r
@@ -496,11 +499,41 @@ conversions (void)
     }                                                                         \\r
   while (0)\r
 \r
-  _pair ("RGB float", "Oklab float", rgb_to_lab, lab_to_rgb);\r
-  _pair ("RGB float", "Oklch float", rgb_to_lch, lch_to_rgb);\r
-\r
-  _pair ("RGBA float", "Oklab alpha float", rgba_to_laba, laba_to_rgba);\r
-  _pair ("RGBA float", "Oklch alpha float", rgba_to_lcha, lcha_to_rgba);\r
+  babl_conversion_new (babl_model("RGBA"),\r
+                       babl_model("OklabA"),\r
+                       "linear", rgba_to_laba,\r
+                       NULL);\r
+  babl_conversion_new (babl_model("OklabA"),\r
+                       babl_model("RGBA"),\r
+                       "linear", laba_to_rgba,\r
+                       NULL);\r
+\r
+  babl_conversion_new (babl_model("RGBA"),\r
+                       babl_model("Oklab"),\r
+                       "linear", rgba_to_lab,\r
+                       NULL);\r
+  babl_conversion_new (babl_model("Oklab"),\r
+                       babl_model("RGBA"),\r
+                       "linear", lab_to_rgba,\r
+                       NULL);\r
+\r
+  babl_conversion_new (babl_model("RGBA"),\r
+                       babl_model("OklchA"),\r
+                       "linear", rgba_to_lcha,\r
+                       NULL);\r
+  babl_conversion_new (babl_model("OklchA"),\r
+                       babl_model("RGBA"),\r
+                       "linear", lcha_to_rgba,\r
+                       NULL);\r
+\r
+  babl_conversion_new (babl_model("RGBA"),\r
+                       babl_model("Oklch"),\r
+                       "linear", rgba_to_lch,\r
+                       NULL);\r
+  babl_conversion_new (babl_model("Oklch"),\r
+                       babl_model("RGBA"),\r
+                       "linear", lch_to_rgba,\r
+                       NULL);\r
 \r
   _pair ("Oklab float", "Oklch float", lab_to_lch, lch_to_lab);\r
   _pair ("Oklab alpha float", "Oklch alpha float", laba_to_lcha, lcha_to_laba);\r