/* 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
}\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
}\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
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
}\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
{\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
{\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
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
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
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
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
}\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
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
} \\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