[babl] CIE: Add xyY color space conversions



commit a1574f0660662f24588da3c5d0616d2f7e46b960
Author: Elle Stone <ellestone ninedegreesbelow com>
Date:   Fri Sep 21 08:40:33 2018 -0400

    CIE: Add xyY color space conversions
    
    Issue #22

 extensions/CIE.c | 724 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 668 insertions(+), 56 deletions(-)
---
diff --git a/extensions/CIE.c b/extensions/CIE.c
index d4d033d..1c8b70c 100644
--- a/extensions/CIE.c
+++ b/extensions/CIE.c
@@ -56,6 +56,9 @@
 #define D50_WHITE_REF_Y   1.000000000f
 #define D50_WHITE_REF_Z   0.824905400f
 
+#define NEAR_ZERO         0.0000000001f
+#define D50_WHITE_REF_x   0.345702921222f
+#define D50_WHITE_REF_y   0.358537532290f
 
 
 static void types (void);
@@ -88,6 +91,9 @@ components (void)
   babl_component_new ("CIE X", NULL);
   babl_component_new ("CIE Y", NULL);
   babl_component_new ("CIE Z", NULL);
+  babl_component_new ("CIE x", NULL);
+  babl_component_new ("CIE y", NULL);
+/*  babl_component_new ("CIE z", NULL);*/
 }
 
 static void
@@ -137,6 +143,21 @@ models (void)
     babl_component ("CIE Z"),
     babl_component ("A"),
     NULL);
+
+  babl_model_new (
+    "name", "CIE xyY",
+    babl_component ("CIE x"),
+    babl_component ("CIE y"),
+    babl_component ("CIE Y"),
+    NULL);
+
+  babl_model_new (
+    "name", "CIE xyY alpha",
+    babl_component ("CIE x"),
+    babl_component ("CIE y"),
+    babl_component ("CIE Y"),
+    babl_component ("A"),
+    NULL);
 }
 
 static void  rgbcie_init (void);
@@ -169,6 +190,22 @@ static inline void LAB_to_XYZ     (double L,
                                    double *to_Z
                                    );
 
+static inline void XYZ_to_xyY     (double X,
+                                   double Y,
+                                   double Z,
+                                   double *to_x,
+                                   double *to_y,
+                                   double *to_Y
+                                   );
+
+static inline void xyY_to_XYZ     (double x,
+                                   double y,
+                                   double Y,
+                                   double *to_X,
+                                   double *to_Y,
+                                   double *to_Z
+                                   );
+
 static inline void
 XYZ_to_LAB (double X,
             double Y,
@@ -216,6 +253,52 @@ LAB_to_XYZ (double L,
   *to_Z = zr * D50_WHITE_REF_Z;
 }
 
+
+static inline void
+XYZ_to_xyY (double X,
+            double Y,
+            double Z,
+            double *to_x,
+            double *to_y,
+            double *to_Y)
+{
+   if ( X < NEAR_ZERO && Y < NEAR_ZERO && Z < NEAR_ZERO ) 
+       { *to_Y = 0.0;
+         *to_x = D50_WHITE_REF_x;
+         *to_y = D50_WHITE_REF_y;
+       }
+       else 
+       {
+       *to_x = X / (X + Y + Z);
+       *to_y = Y / (X + Y + Z);
+       *to_Y = Y;
+    }
+}
+
+static inline void
+xyY_to_XYZ (double x,
+            double y,
+            double Y,
+            double *to_X,
+            double *to_Y,
+            double *to_Z)
+{
+   if ( Y < NEAR_ZERO ) 
+       { *to_X = 0.0;
+         *to_Y = 0.0;
+         *to_Z = 0.0;
+       }
+       else 
+       {
+       *to_X = (x * Y) / y;
+       *to_Y = Y;
+       *to_Z = ((1 - x - y) * Y) / y;
+    }
+}
+
+
+/* rgb <-> XYZ */
+
 static void
 rgba_to_xyz (const Babl *conversion,char *src,
              char *dst,
@@ -282,6 +365,447 @@ xyza_to_rgba (const Babl *conversion,char *src,
 }
 
 
+/* rgb -> xyY */
+
+static void
+rgba_to_xyY (const Babl *conversion,char *src,
+             char *dst,
+             long  n)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  while (n--)
+    {
+      double XYZ[3], x, y, Y;
+
+      babl_space_to_xyz (space, (double*)src, XYZ);
+      XYZ_to_xyY (XYZ[0], XYZ[1], XYZ[2], &x, &y, &Y);
+
+      ((double *) dst)[0] = x;
+      ((double *) dst)[1] = y;
+      ((double *) dst)[2] = Y;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 3;
+    }
+}
+
+static void
+rgba_to_xyYa (const Babl *conversion,char *src,
+              char *dst,
+              long  n)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  while (n--)
+    {
+      double alpha = ((double *) src)[3];
+      double XYZ[3], x, y, Y;
+
+      //convert RGB to XYZ
+      babl_space_to_xyz (space, (double*)src, XYZ);
+
+      //convert XYZ to xyY
+      XYZ_to_xyY (XYZ[0], XYZ[1], XYZ[2], &x, &y, &Y);
+
+      ((double *) dst)[0] = x;
+      ((double *) dst)[1] = y;
+      ((double *) dst)[2] = Y;
+      ((double *) dst)[3] = alpha;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
+    }
+}
+
+static void
+rgbaf_to_xyYaf (const Babl *conversion, 
+                float *src,
+                float *dst,
+                long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+  float x, y, X, Y, Z, r, g, b, a;
+      r = src[0];
+      g = src[1];
+      b = src[2];
+      a = src[3];
+
+      if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) 
+           {
+          Y = 0.0f;
+             x = D50_WHITE_REF_x;
+             y = D50_WHITE_REF_y;
+           }
+
+      else 
+        {
+          X = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+          Y = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+          Z = m_2_0 * r + m_2_1 * g + m_2_2 * b;
+
+             x = X / (X + Y + Z);
+             y = Y / (X + Y + Z);
+        }
+
+      dst[0] = x;
+      dst[1] = y;
+      dst[2] = Y;
+      dst[3] = a;
+
+      src += 4;
+      dst += 4;
+    }
+}
+
+static void
+rgbf_to_xyYf (const Babl *conversion,float *src,
+              float *dst,
+              long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+  float x, y, X, Y, Z, r, g, b;
+      r = src[0];
+      g = src[1];
+      b = src[2];
+
+      if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) 
+           {
+          Y = 0.0f;
+             x = D50_WHITE_REF_x;
+             y = D50_WHITE_REF_y;
+           }
+
+      else 
+        {
+          X = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+          Y = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+          Z = m_2_0 * r + m_2_1 * g + m_2_2 * b;
+
+             x = X / (X + Y + Z);
+             y = Y / (X + Y + Z);
+        }
+
+      dst[0] = x;
+      dst[1] = y;
+      dst[2] = Y;
+
+      src += 3;
+      dst += 3;
+    }
+}
+
+
+static void
+rgbaf_to_xyYf (const Babl *conversion, 
+               float *src,
+               float *dst,
+               long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X;
+  float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X;
+  float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X;
+  float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y;
+  float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y;
+  float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y;
+  float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z;
+  float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z;
+  float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+  float x, y, X, Y, Z, r, g, b;
+      r = src[0];
+      g = src[1];
+      b = src[2];
+
+      if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) 
+           {
+          Y = 0.0f;
+             x = D50_WHITE_REF_x;
+             y = D50_WHITE_REF_y;
+           }
+
+      else 
+        {
+          X = m_0_0 * r + m_0_1 * g + m_0_2 * b;
+          Y = m_1_0 * r + m_1_1 * g + m_1_2 * b;
+          Z = m_2_0 * r + m_2_1 * g + m_2_2 * b;
+
+             x = X / (X + Y + Z);
+             y = Y / (X + Y + Z);
+        }
+
+      dst[0] = x;
+      dst[1] = y;
+      dst[2] = Y;
+
+      src += 4;
+      dst += 4;
+    }
+}
+
+
+/* xyY -> rgb */
+
+static void
+xyY_to_rgba (const Babl *conversion,char *src,
+             char *dst,
+             long  n)
+{
+  const Babl *space = babl_conversion_get_destination_space (conversion);
+  while (n--)
+    {
+      double x = ((double *) src)[0];
+      double y = ((double *) src)[1];
+      double Y = ((double *) src)[2];
+
+      double R, G, B, X, Z;
+
+      //convert xyY to XYZ
+      xyY_to_XYZ (x, y, Y, &X, &Y, &Z);
+
+      //convert XYZ to RGB
+      {
+        double XYZ[3]  = {X,Y,Z};
+        double RGB[3];
+        babl_space_from_xyz (space, XYZ, RGB);
+        R = RGB[0];
+        G = RGB[1];
+        B = RGB[2];
+      }
+
+      ((double *) dst)[0] = R;
+      ((double *) dst)[1] = G;
+      ((double *) dst)[2] = B;
+      ((double *) dst)[3] = 1.0;
+
+      src += sizeof (double) * 3;
+      dst += sizeof (double) * 4;
+    }
+}
+
+
+static void
+xyYa_to_rgba (const Babl *conversion,char *src,
+              char *dst,
+              long  n)
+{
+  const Babl *space = babl_conversion_get_destination_space (conversion);
+  while (n--)
+    {
+      double x     = ((double *) src)[0];
+      double y     = ((double *) src)[1];
+      double Y     = ((double *) src)[2];
+      double alpha = ((double *) src)[3];
+
+      double X, Z;
+
+      //convert xyY to XYZ
+      xyY_to_XYZ (x, y, Y, &X, &Y, &Z);
+
+      {
+        //convert XYZ to RGB
+        double XYZ[3]  = {X,Y,Z};
+        babl_space_from_xyz (space, XYZ, (double*)dst);
+      }
+      ((double *) dst)[3] = alpha;
+
+      src += sizeof (double) * 4;
+      dst += sizeof (double) * 4;
+    }
+}
+
+
+static void
+xyYf_to_rgbf (const Babl *conversion,float *src,
+                float *dst,
+                long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X;
+  float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y;
+  float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z;
+  float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X;
+  float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y;
+  float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z;
+  float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X;
+  float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y;
+  float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+      float X, Z, r, g, b;
+      float x = src[0];
+      float y = src[1];
+      float Y = src[2];
+
+
+      if ( Y < NEAR_ZERO ) 
+            {
+              X = 0.0f;
+              Y = 0.0f;
+              Z = 0.0f;
+            }
+      else 
+            {
+              X = (x * Y) / y;
+              Y = Y;
+              Z = ((1 - x - y) * Y) / y;
+         }
+
+      r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z;
+      g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z;
+      b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z;
+
+      dst[0] = r;
+      dst[1] = g;
+      dst[2] = b;
+
+      src += 3;
+      dst += 3;
+    }
+}
+
+
+
+static void
+xyYf_to_rgbaf (const Babl *conversion, 
+               float *src,
+               float *dst,
+               long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X;
+  float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y;
+  float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z;
+  float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X;
+  float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y;
+  float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z;
+  float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X;
+  float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y;
+  float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+      float X, Z, r, g, b;
+      float x = src[0];
+      float y = src[1];
+      float Y = src[2];
+
+
+      if ( Y < NEAR_ZERO ) 
+            {
+              X = 0.0f;
+              Y = 0.0f;
+              Z = 0.0f;
+            }
+      else 
+            {
+              X = (x * Y) / y;
+              Y = Y;
+              Z = ((1 - x - y) * Y) / y;
+         }
+
+      r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z;
+      g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z;
+      b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z;
+
+      dst[0] =    r;
+      dst[1] =    g;
+      dst[2] =    b;
+      dst[3] = 1.0f;
+
+      src += 4;
+      dst += 4;
+    }
+}
+
+static void
+xyYaf_to_rgbaf (const Babl *conversion, 
+                float *src,
+                float *dst,
+                long   samples)
+{
+  const Babl *space = babl_conversion_get_source_space (conversion);
+  float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X;
+  float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y;
+  float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z;
+  float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X;
+  float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y;
+  float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z;
+  float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X;
+  float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y;
+  float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z;
+  long n = samples;
+
+  while (n--)
+    {
+      float X, Z, r, g, b;
+      float x = src[0];
+      float y = src[1];
+      float Y = src[2];
+      float a = src[3];
+
+
+      if ( Y < NEAR_ZERO ) 
+            {
+              X = 0.0f;
+              Y = 0.0f;
+              Z = 0.0f;
+            }
+      else 
+            {
+              X = (x * Y) / y;
+              Y = Y;
+              Z = ((1 - x - y) * Y) / y;
+         }
+
+      r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z;
+      g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z;
+      b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z;
+
+      dst[0] = r;
+      dst[1] = g;
+      dst[2] = b;
+      dst[3] = a;
+
+      src += 4;
+      dst += 4;
+    }
+}
+
+
+/* rgb <-> LAB */
+
 static void
 rgba_to_lab (const Babl *conversion,char *src,
              char *dst,
@@ -305,7 +829,6 @@ rgba_to_lab (const Babl *conversion,char *src,
 }
 
 
-
 static void
 lab_to_rgba (const Babl *conversion,char *src,
              char *dst,
@@ -400,6 +923,9 @@ laba_to_rgba (const Babl *conversion,char *src,
     }
 }
 
+
+/* rgb <-> LCh */
+
 static inline void
 CHab_to_ab (double  C,
             double  H,
@@ -1426,6 +1952,8 @@ rgbaf_to_Labaf_sse2 (const Babl *conversion, const float *src, float *dst, long
 static void
 conversions (void)
 {
+  /* babl_model */
+
   babl_conversion_new (
     babl_model ("RGBA"),
     babl_model ("CIE Lab"),
@@ -1444,28 +1972,91 @@ conversions (void)
     "linear", rgba_to_laba,
     NULL
   );
-  babl_conversion_new (
+    babl_conversion_new (
     babl_model ("CIE Lab alpha"),
     babl_model ("RGBA"),
     "linear", laba_to_rgba,
     NULL
   );
   babl_conversion_new (
-    babl_format ("RGB float"),
-    babl_format ("CIE Lab float"),
-    "linear", rgbf_to_Labf,
+    babl_model ("RGBA"),
+    babl_model ("CIE LCH(ab)"),
+    "linear", rgba_to_lchab,
     NULL
   );
   babl_conversion_new (
-    babl_format ("CIE Lab float"),
-    babl_format ("RGB float"),
-    "linear", Labf_to_rgbf,
+    babl_model ("CIE LCH(ab)"),
+    babl_model ("RGBA"),
+    "linear", lchab_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE LCH(ab) alpha"),
+    "linear", rgba_to_lchaba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE LCH(ab) alpha"),
+    babl_model ("RGBA"),
+    "linear", lchaba_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE XYZ"),
+    "linear", rgba_to_xyz,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE XYZ"),
+    babl_model ("RGBA"),
+    "linear", xyz_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE XYZ alpha"),
+    "linear", rgba_to_xyza,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE XYZ alpha"),
+    babl_model ("RGBA"),
+    "linear", xyza_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE xyY"),
+    "linear", rgba_to_xyY,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE xyY"),
+    babl_model ("RGBA"),
+    "linear", xyY_to_rgba,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("RGBA"),
+    babl_model ("CIE xyY alpha"),
+    "linear", rgba_to_xyYa,
+    NULL
+  );
+  babl_conversion_new (
+    babl_model ("CIE xyY alpha"),
+    babl_model ("RGBA"),
+    "linear", xyYa_to_rgba,
     NULL
   );
+
+  /* babl_format */
+
   babl_conversion_new (
+    babl_format ("RGB float"),
     babl_format ("CIE Lab float"),
-    babl_format ("RGBA float"),
-    "linear", Labf_to_rgbaf,
+    "linear", rgbf_to_Labf,
     NULL
   );
   babl_conversion_new (
@@ -1480,6 +2071,18 @@ conversions (void)
     "linear", rgbaf_to_Labaf,
     NULL
   );
+  babl_conversion_new (
+    babl_format ("CIE Lab float"),
+    babl_format ("RGB float"),
+    "linear", Labf_to_rgbf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("CIE Lab float"),
+    babl_format ("RGBA float"),
+    "linear", Labf_to_rgbaf,
+    NULL
+  );
   babl_conversion_new (
     babl_format ("CIE Lab alpha float"),
     babl_format ("RGBA float"),
@@ -1522,30 +2125,6 @@ conversions (void)
     "linear", Labaf_to_Lf,
     NULL
   );
-  babl_conversion_new (
-    babl_model ("RGBA"),
-    babl_model ("CIE LCH(ab)"),
-    "linear", rgba_to_lchab,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model ("CIE LCH(ab)"),
-    babl_model ("RGBA"),
-    "linear", lchab_to_rgba,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model ("RGBA"),
-    babl_model ("CIE LCH(ab) alpha"),
-    "linear", rgba_to_lchaba,
-    NULL
-  );
-  babl_conversion_new (
-    babl_model ("CIE LCH(ab) alpha"),
-    babl_model ("RGBA"),
-    "linear", lchaba_to_rgba,
-    NULL
-  );
   babl_conversion_new (
     babl_format ("CIE Lab float"),
     babl_format ("CIE LCH(ab) float"),
@@ -1571,27 +2150,39 @@ conversions (void)
     NULL
   );
   babl_conversion_new (
-    babl_model ("RGBA"),
-    babl_model ("CIE XYZ"),
-    "linear", rgba_to_xyz,
+    babl_format ("RGB float"),
+    babl_format ("CIE xyY float"),
+    "linear", rgbf_to_xyYf,
     NULL
   );
   babl_conversion_new (
-    babl_model ("CIE XYZ"),
-    babl_model ("RGBA"),
-    "linear", xyz_to_rgba,
+    babl_format ("CIE xyY float"),
+    babl_format ("RGB float"),
+    "linear", xyYf_to_rgbf,
     NULL
   );
   babl_conversion_new (
-    babl_model ("RGBA"),
-    babl_model ("CIE XYZ alpha"),
-    "linear", rgba_to_xyza,
+    babl_format ("RGBA float"),
+    babl_format ("CIE xyY float"),
+    "linear", rgbaf_to_xyYf,
     NULL
   );
   babl_conversion_new (
-    babl_model ("CIE XYZ alpha"),
-    babl_model ("RGBA"),
-    "linear", xyza_to_rgba,
+    babl_format ("CIE xyY float"),
+    babl_format ("RGBA float"),
+    "linear", xyYf_to_rgbaf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("RGBA float"),
+    babl_format ("CIE xyY alpha float"),
+    "linear", rgbaf_to_xyYaf,
+    NULL
+  );
+  babl_conversion_new (
+    babl_format ("CIE xyY alpha float"),
+    babl_format ("RGBA float"),
+    "linear", xyYaf_to_rgbaf,
     NULL
   );
 
@@ -1675,6 +2266,27 @@ formats (void)
     babl_component ("A"),
     NULL);
 
+  babl_format_new (
+    "name", "CIE LCH(ab) float",
+    babl_model ("CIE LCH(ab)"),
+
+    babl_type ("float"),
+    babl_component ("CIE L"),
+    babl_component ("CIE C(ab)"),
+    babl_component ("CIE H(ab)"),
+    NULL);
+
+  babl_format_new (
+    "name", "CIE LCH(ab) alpha float",
+    babl_model ("CIE LCH(ab) alpha"),
+
+    babl_type ("float"),
+    babl_component ("CIE L"),
+    babl_component ("CIE C(ab)"),
+    babl_component ("CIE H(ab)"),
+    babl_component ("A"),
+    NULL);
+
   babl_format_new (
     "name", "CIE L float",
     babl_model ("CIE Lab"),
@@ -1715,23 +2327,23 @@ formats (void)
     NULL);
 
   babl_format_new (
-    "name", "CIE LCH(ab) float",
-    babl_model ("CIE LCH(ab)"),
+    "name", "CIE xyY float",
+    babl_model ("CIE xyY"),
 
     babl_type ("float"),
-    babl_component ("CIE L"),
-    babl_component ("CIE C(ab)"),
-    babl_component ("CIE H(ab)"),
+    babl_component ("CIE x"),
+    babl_component ("CIE y"),
+    babl_component ("CIE Y"),
     NULL);
 
   babl_format_new (
-    "name", "CIE LCH(ab) alpha float",
-    babl_model ("CIE LCH(ab) alpha"),
+    "name", "CIE xyY alpha float",
+    babl_model ("CIE xyY alpha"),
 
     babl_type ("float"),
-    babl_component ("CIE L"),
-    babl_component ("CIE C(ab)"),
-    babl_component ("CIE H(ab)"),
+    babl_component ("CIE x"),
+    babl_component ("CIE y"),
+    babl_component ("CIE Y"),
     babl_component ("A"),
     NULL);
 }


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