diff options
Diffstat (limited to '')
-rw-r--r-- | libcolour.h | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/libcolour.h b/libcolour.h new file mode 100644 index 0000000..0ea98a7 --- /dev/null +++ b/libcolour.h @@ -0,0 +1,445 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef LIBCOLOUR_H +#define LIBCOLOUR_H + +#include <stddef.h> + + +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpadded" +#elif defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +#endif + + +#define LIBCOLOUR_ILL__(S, T, X_, Y_) (S){.model = LIBCOLOUR_CIEXYY, .x = (T)(X_), .y = (T)(Y_), .Y = 1} +#define LIBCOLOUR_F__(X_, Y_) LIBCOLOUR_ILL__(libcolour_ciexyy_f_t, float, (X_), (Y_)) +#define LIBCOLOUR_LF__(X_, Y_) LIBCOLOUR_ILL__(libcolour_ciexyy_lf_t, double, (X_), (Y_)) +#define LIBCOLOUR_LLF__(X_, Y_) LIBCOLOUR_ILL__(libcolour_ciexyy_llf_t, long double, (X_), (Y_)) + +/* 2-degrees observer standard illuminants */ +#define LIBCOLOUR_ILLUMINANT_A_F LIBCOLOUR_F__(0.447573514098910552050369915378, 0.407439444306660847328060981454) +#define LIBCOLOUR_ILLUMINANT_B_F LIBCOLOUR_F__(0.348407693041403399014654951316, 0.351617234807268863594487129376) +#define LIBCOLOUR_ILLUMINANT_C_F LIBCOLOUR_F__(0.310058473730255412803558101587, 0.316149707523236456196968902077) +#define LIBCOLOUR_ILLUMINANT_D50_F LIBCOLOUR_F__(0.345668037029273123028616510055, 0.358496838937619077825047497754) +#define LIBCOLOUR_ILLUMINANT_D55_F LIBCOLOUR_F__(0.332424102468830251488896010414, 0.347428039087666229445261478759) +#define LIBCOLOUR_ILLUMINANT_D65_F LIBCOLOUR_F__(0.312726871026564878786047074755, 0.329023206641284038376227272238) +#define LIBCOLOUR_ILLUMINANT_D75_F LIBCOLOUR_F__(0.299022300412497055166483050925, 0.314852737888341893679466920730) +#define LIBCOLOUR_ILLUMINANT_E_F LIBCOLOUR_F__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_F LIBCOLOUR_F__(0.313062433035651010992950205036, 0.337106477918307445573731229160) +#define LIBCOLOUR_ILLUMINANT_F2_F LIBCOLOUR_F__(0.372068154452825539113547392844, 0.375122558203110079144693145281) +#define LIBCOLOUR_ILLUMINANT_F3_F LIBCOLOUR_F__(0.409090035308107391465171076561, 0.394117134255365986206243178458) +#define LIBCOLOUR_ILLUMINANT_F4_F LIBCOLOUR_F__(0.440181095827666568620628595454, 0.403090691158138336724903183494) +#define LIBCOLOUR_ILLUMINANT_F5_F LIBCOLOUR_F__(0.313756583095696484075887155996, 0.345160794752101929283583103825) +#define LIBCOLOUR_ILLUMINANT_F6_F LIBCOLOUR_F__(0.377882361062687466279896852939, 0.388192885537868959122675960316) +#define LIBCOLOUR_ILLUMINANT_F7_F LIBCOLOUR_F__(0.312852472915475354753311876266, 0.329174178033567632617462095368) +#define LIBCOLOUR_ILLUMINANT_F8_F LIBCOLOUR_F__(0.345805753550315952971061506105, 0.358617583214377477762724311106) +#define LIBCOLOUR_ILLUMINANT_F9_F LIBCOLOUR_F__(0.374105245592801061160770359493, 0.372672400924498159469067104510) +#define LIBCOLOUR_ILLUMINANT_F10_F LIBCOLOUR_F__(0.346086913993929323751785886998, 0.358751605952200347537939251197) +#define LIBCOLOUR_ILLUMINANT_F11_F LIBCOLOUR_F__(0.380537485483030235577928124258, 0.376915309293930078649026427229) +#define LIBCOLOUR_ILLUMINANT_F12_F LIBCOLOUR_F__(0.437023901312296902954557253906, 0.404214327891585678553809657387) + +#define LIBCOLOUR_ILLUMINANT_A_LF LIBCOLOUR_LF__(0.447573514098910552050369915378, 0.407439444306660847328060981454) +#define LIBCOLOUR_ILLUMINANT_B_LF LIBCOLOUR_LF__(0.348407693041403399014654951316, 0.351617234807268863594487129376) +#define LIBCOLOUR_ILLUMINANT_C_LF LIBCOLOUR_LF__(0.310058473730255412803558101587, 0.316149707523236456196968902077) +#define LIBCOLOUR_ILLUMINANT_D50_LF LIBCOLOUR_LF__(0.345668037029273123028616510055, 0.358496838937619077825047497754) +#define LIBCOLOUR_ILLUMINANT_D55_LF LIBCOLOUR_LF__(0.332424102468830251488896010414, 0.347428039087666229445261478759) +#define LIBCOLOUR_ILLUMINANT_D65_LF LIBCOLOUR_LF__(0.312726871026564878786047074755, 0.329023206641284038376227272238) +#define LIBCOLOUR_ILLUMINANT_D75_LF LIBCOLOUR_LF__(0.299022300412497055166483050925, 0.314852737888341893679466920730) +#define LIBCOLOUR_ILLUMINANT_E_LF LIBCOLOUR_LF__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_LF LIBCOLOUR_LF__(0.313062433035651010992950205036, 0.337106477918307445573731229160) +#define LIBCOLOUR_ILLUMINANT_F2_LF LIBCOLOUR_LF__(0.372068154452825539113547392844, 0.375122558203110079144693145281) +#define LIBCOLOUR_ILLUMINANT_F3_LF LIBCOLOUR_LF__(0.409090035308107391465171076561, 0.394117134255365986206243178458) +#define LIBCOLOUR_ILLUMINANT_F4_LF LIBCOLOUR_LF__(0.440181095827666568620628595454, 0.403090691158138336724903183494) +#define LIBCOLOUR_ILLUMINANT_F5_LF LIBCOLOUR_LF__(0.313756583095696484075887155996, 0.345160794752101929283583103825) +#define LIBCOLOUR_ILLUMINANT_F6_LF LIBCOLOUR_LF__(0.377882361062687466279896852939, 0.388192885537868959122675960316) +#define LIBCOLOUR_ILLUMINANT_F7_LF LIBCOLOUR_LF__(0.312852472915475354753311876266, 0.329174178033567632617462095368) +#define LIBCOLOUR_ILLUMINANT_F8_LF LIBCOLOUR_LF__(0.345805753550315952971061506105, 0.358617583214377477762724311106) +#define LIBCOLOUR_ILLUMINANT_F9_LF LIBCOLOUR_LF__(0.374105245592801061160770359493, 0.372672400924498159469067104510) +#define LIBCOLOUR_ILLUMINANT_F10_LF LIBCOLOUR_LF__(0.346086913993929323751785886998, 0.358751605952200347537939251197) +#define LIBCOLOUR_ILLUMINANT_F11_LF LIBCOLOUR_LF__(0.380537485483030235577928124258, 0.376915309293930078649026427229) +#define LIBCOLOUR_ILLUMINANT_F12_LF LIBCOLOUR_LF__(0.437023901312296902954557253906, 0.404214327891585678553809657387) + +#define LIBCOLOUR_ILLUMINANT_A_LLF LIBCOLOUR_LLF__(0.447573514098910552050369915378, 0.407439444306660847328060981454) +#define LIBCOLOUR_ILLUMINANT_B_LLF LIBCOLOUR_LLF__(0.348407693041403399014654951316, 0.351617234807268863594487129376) +#define LIBCOLOUR_ILLUMINANT_C_LLF LIBCOLOUR_LLF__(0.310058473730255412803558101587, 0.316149707523236456196968902077) +#define LIBCOLOUR_ILLUMINANT_D50_LLF LIBCOLOUR_LLF__(0.345668037029273123028616510055, 0.358496838937619077825047497754) +#define LIBCOLOUR_ILLUMINANT_D55_LLF LIBCOLOUR_LLF__(0.332424102468830251488896010414, 0.347428039087666229445261478759) +#define LIBCOLOUR_ILLUMINANT_D65_LLF LIBCOLOUR_LLF__(0.312726871026564878786047074755, 0.329023206641284038376227272238) +#define LIBCOLOUR_ILLUMINANT_D75_LLF LIBCOLOUR_LLF__(0.299022300412497055166483050925, 0.314852737888341893679466920730) +#define LIBCOLOUR_ILLUMINANT_E_LLF LIBCOLOUR_LLF__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_LLF LIBCOLOUR_LLF__(0.313062433035651010992950205036, 0.337106477918307445573731229160) +#define LIBCOLOUR_ILLUMINANT_F2_LLF LIBCOLOUR_LLF__(0.372068154452825539113547392844, 0.375122558203110079144693145281) +#define LIBCOLOUR_ILLUMINANT_F3_LLF LIBCOLOUR_LLF__(0.409090035308107391465171076561, 0.394117134255365986206243178458) +#define LIBCOLOUR_ILLUMINANT_F4_LLF LIBCOLOUR_LLF__(0.440181095827666568620628595454, 0.403090691158138336724903183494) +#define LIBCOLOUR_ILLUMINANT_F5_LLF LIBCOLOUR_LLF__(0.313756583095696484075887155996, 0.345160794752101929283583103825) +#define LIBCOLOUR_ILLUMINANT_F6_LLF LIBCOLOUR_LLF__(0.377882361062687466279896852939, 0.388192885537868959122675960316) +#define LIBCOLOUR_ILLUMINANT_F7_LLF LIBCOLOUR_LLF__(0.312852472915475354753311876266, 0.329174178033567632617462095368) +#define LIBCOLOUR_ILLUMINANT_F8_LLF LIBCOLOUR_LLF__(0.345805753550315952971061506105, 0.358617583214377477762724311106) +#define LIBCOLOUR_ILLUMINANT_F9_LLF LIBCOLOUR_LLF__(0.374105245592801061160770359493, 0.372672400924498159469067104510) +#define LIBCOLOUR_ILLUMINANT_F10_LLF LIBCOLOUR_LLF__(0.346086913993929323751785886998, 0.358751605952200347537939251197) +#define LIBCOLOUR_ILLUMINANT_F11_LLF LIBCOLOUR_LLF__(0.380537485483030235577928124258, 0.376915309293930078649026427229) +#define LIBCOLOUR_ILLUMINANT_F12_LLF LIBCOLOUR_LLF__(0.437023901312296902954557253906, 0.404214327891585678553809657387) + +/* 10-degrees observer standard illuminants */ +#define LIBCOLOUR_ILLUMINANT_A_10DEG_OBS_F LIBCOLOUR_F__(0.451173939693730152722395132514, 0.405936604212625562482230634487) +#define LIBCOLOUR_ILLUMINANT_B_10DEG_OBS_F LIBCOLOUR_F__(0.349819801494100579564161535018, 0.352687989927865819250740742063) +#define LIBCOLOUR_ILLUMINANT_C_10DEG_OBS_F LIBCOLOUR_F__(0.310388663270034004248998371622, 0.319050711366790695766582075521) +#define LIBCOLOUR_ILLUMINANT_D50_10DEG_OBS_F LIBCOLOUR_F__(0.347729429961154856698613002663, 0.359522508516545380441442603114) +#define LIBCOLOUR_ILLUMINANT_D55_10DEG_OBS_F LIBCOLOUR_F__(0.334116336430253457745465084372, 0.348766090975953568786849245953) +#define LIBCOLOUR_ILLUMINANT_D65_10DEG_OBS_F LIBCOLOUR_F__(0.313823646938709621689866935412, 0.330998985489933561510156323493) +#define LIBCOLOUR_ILLUMINANT_D75_10DEG_OBS_F LIBCOLOUR_F__(0.299679971345752860223399238748, 0.317403239854836705102769656150) +#define LIBCOLOUR_ILLUMINANT_E_10DEG_OBS_F LIBCOLOUR_F__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_10DEG_OBS_F LIBCOLOUR_F__(0.318098801070991199502202562144, 0.335489451474129951602520804954) +#define LIBCOLOUR_ILLUMINANT_F2_10DEG_OBS_F LIBCOLOUR_F__(0.379274832262508854174853922814, 0.367227934400669309145115448700) +#define LIBCOLOUR_ILLUMINANT_F3_10DEG_OBS_F LIBCOLOUR_F__(0.417644682102624287267644831445, 0.383124504918675723441623404142) +#define LIBCOLOUR_ILLUMINANT_F4_10DEG_OBS_F LIBCOLOUR_F__(0.449247699162001246087072559021, 0.390605475879083674506375700730) +#define LIBCOLOUR_ILLUMINANT_F5_10DEG_OBS_F LIBCOLOUR_F__(0.319739939104951298443069163113, 0.342367055369128092667807550242) +#define LIBCOLOUR_ILLUMINANT_F6_10DEG_OBS_F LIBCOLOUR_F__(0.386626908526034762658696308790, 0.378372201588893453116924092683) +#define LIBCOLOUR_ILLUMINANT_F7_10DEG_OBS_F LIBCOLOUR_F__(0.315645637312390425766039925293, 0.329508145132134222521358424274) +#define LIBCOLOUR_ILLUMINANT_F8_10DEG_OBS_F LIBCOLOUR_F__(0.348965563721531868424108324689, 0.359317299140994528272585739614) +#define LIBCOLOUR_ILLUMINANT_F9_10DEG_OBS_F LIBCOLOUR_F__(0.378258900384649654480284652891, 0.370371375730762564248976786985) +#define LIBCOLOUR_ILLUMINANT_F10_10DEG_OBS_F LIBCOLOUR_F__(0.350893389986753234666139178444, 0.354302210111646531665030579461) +#define LIBCOLOUR_ILLUMINANT_F11_10DEG_OBS_F LIBCOLOUR_F__(0.385435391037903751776383387551, 0.371094786781121399599214782938) +#define LIBCOLOUR_ILLUMINANT_F12_10DEG_OBS_F LIBCOLOUR_F__(0.442654456042513022584472537346, 0.397060737666593277506166259627) + +#define LIBCOLOUR_ILLUMINANT_A_10DEG_OBS_LF LIBCOLOUR_LF__(0.451173939693730152722395132514, 0.405936604212625562482230634487) +#define LIBCOLOUR_ILLUMINANT_B_10DEG_OBS_LF LIBCOLOUR_LF__(0.349819801494100579564161535018, 0.352687989927865819250740742063) +#define LIBCOLOUR_ILLUMINANT_C_10DEG_OBS_LF LIBCOLOUR_LF__(0.310388663270034004248998371622, 0.319050711366790695766582075521) +#define LIBCOLOUR_ILLUMINANT_D50_10DEG_OBS_LF LIBCOLOUR_LF__(0.347729429961154856698613002663, 0.359522508516545380441442603114) +#define LIBCOLOUR_ILLUMINANT_D55_10DEG_OBS_LF LIBCOLOUR_LF__(0.334116336430253457745465084372, 0.348766090975953568786849245953) +#define LIBCOLOUR_ILLUMINANT_D65_10DEG_OBS_LF LIBCOLOUR_LF__(0.313823646938709621689866935412, 0.330998985489933561510156323493) +#define LIBCOLOUR_ILLUMINANT_D75_10DEG_OBS_LF LIBCOLOUR_LF__(0.299679971345752860223399238748, 0.317403239854836705102769656150) +#define LIBCOLOUR_ILLUMINANT_E_10DEG_OBS_LF LIBCOLOUR_LF__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_10DEG_OBS_LF LIBCOLOUR_LF__(0.318098801070991199502202562144, 0.335489451474129951602520804954) +#define LIBCOLOUR_ILLUMINANT_F2_10DEG_OBS_LF LIBCOLOUR_LF__(0.379274832262508854174853922814, 0.367227934400669309145115448700) +#define LIBCOLOUR_ILLUMINANT_F3_10DEG_OBS_LF LIBCOLOUR_LF__(0.417644682102624287267644831445, 0.383124504918675723441623404142) +#define LIBCOLOUR_ILLUMINANT_F4_10DEG_OBS_LF LIBCOLOUR_LF__(0.449247699162001246087072559021, 0.390605475879083674506375700730) +#define LIBCOLOUR_ILLUMINANT_F5_10DEG_OBS_LF LIBCOLOUR_LF__(0.319739939104951298443069163113, 0.342367055369128092667807550242) +#define LIBCOLOUR_ILLUMINANT_F6_10DEG_OBS_LF LIBCOLOUR_LF__(0.386626908526034762658696308790, 0.378372201588893453116924092683) +#define LIBCOLOUR_ILLUMINANT_F7_10DEG_OBS_LF LIBCOLOUR_LF__(0.315645637312390425766039925293, 0.329508145132134222521358424274) +#define LIBCOLOUR_ILLUMINANT_F8_10DEG_OBS_LF LIBCOLOUR_LF__(0.348965563721531868424108324689, 0.359317299140994528272585739614) +#define LIBCOLOUR_ILLUMINANT_F9_10DEG_OBS_LF LIBCOLOUR_LF__(0.378258900384649654480284652891, 0.370371375730762564248976786985) +#define LIBCOLOUR_ILLUMINANT_F10_10DEG_OBS_LF LIBCOLOUR_LF__(0.350893389986753234666139178444, 0.354302210111646531665030579461) +#define LIBCOLOUR_ILLUMINANT_F11_10DEG_OBS_LF LIBCOLOUR_LF__(0.385435391037903751776383387551, 0.371094786781121399599214782938) +#define LIBCOLOUR_ILLUMINANT_F12_10DEG_OBS_LF LIBCOLOUR_LF__(0.442654456042513022584472537346, 0.397060737666593277506166259627) + +#define LIBCOLOUR_ILLUMINANT_A_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.451173939693730152722395132514, 0.405936604212625562482230634487) +#define LIBCOLOUR_ILLUMINANT_B_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.349819801494100579564161535018, 0.352687989927865819250740742063) +#define LIBCOLOUR_ILLUMINANT_C_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.310388663270034004248998371622, 0.319050711366790695766582075521) +#define LIBCOLOUR_ILLUMINANT_D50_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.347729429961154856698613002663, 0.359522508516545380441442603114) +#define LIBCOLOUR_ILLUMINANT_D55_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.334116336430253457745465084372, 0.348766090975953568786849245953) +#define LIBCOLOUR_ILLUMINANT_D65_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.313823646938709621689866935412, 0.330998985489933561510156323493) +#define LIBCOLOUR_ILLUMINANT_D75_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.299679971345752860223399238748, 0.317403239854836705102769656150) +#define LIBCOLOUR_ILLUMINANT_E_10DEG_OBS_LLF LIBCOLOUR_LLF__(1. / 3, 1. / 3) +#define LIBCOLOUR_ILLUMINANT_F1_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.318098801070991199502202562144, 0.335489451474129951602520804954) +#define LIBCOLOUR_ILLUMINANT_F2_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.379274832262508854174853922814, 0.367227934400669309145115448700) +#define LIBCOLOUR_ILLUMINANT_F3_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.417644682102624287267644831445, 0.383124504918675723441623404142) +#define LIBCOLOUR_ILLUMINANT_F4_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.449247699162001246087072559021, 0.390605475879083674506375700730) +#define LIBCOLOUR_ILLUMINANT_F5_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.319739939104951298443069163113, 0.342367055369128092667807550242) +#define LIBCOLOUR_ILLUMINANT_F6_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.386626908526034762658696308790, 0.378372201588893453116924092683) +#define LIBCOLOUR_ILLUMINANT_F7_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.315645637312390425766039925293, 0.329508145132134222521358424274) +#define LIBCOLOUR_ILLUMINANT_F8_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.348965563721531868424108324689, 0.359317299140994528272585739614) +#define LIBCOLOUR_ILLUMINANT_F9_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.378258900384649654480284652891, 0.370371375730762564248976786985) +#define LIBCOLOUR_ILLUMINANT_F10_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.350893389986753234666139178444, 0.354302210111646531665030579461) +#define LIBCOLOUR_ILLUMINANT_F11_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.385435391037903751776383387551, 0.371094786781121399599214782938) +#define LIBCOLOUR_ILLUMINANT_F12_10DEG_OBS_LLF LIBCOLOUR_LLF__(0.442654456042513022584472537346, 0.397060737666593277506166259627) + + +#define LIBCOLOUR_LIST_MODELS_N(_, RES, ...)\ + _(LIBCOLOUR_RGB, libcolour_rgb_##RES##_t, rgb, __VA_ARGS__)\ + _(LIBCOLOUR_SRGB, libcolour_srgb_##RES##_t, srgb, __VA_ARGS__)\ + _(LIBCOLOUR_CIEXYY, libcolour_ciexyy_##RES##_t, ciexyy, __VA_ARGS__)\ + _(LIBCOLOUR_CIEXYZ, libcolour_ciexyz_##RES##_t, ciexyz, __VA_ARGS__)\ + _(LIBCOLOUR_CIELAB, libcolour_cielab_##RES##_t, cielab, __VA_ARGS__)\ + _(LIBCOLOUR_CIELUV, libcolour_cieluv_##RES##_t, cieluv, __VA_ARGS__)\ + _(LIBCOLOUR_CIELCHUV, libcolour_cielchuv_##RES##_t, cielchuv, __VA_ARGS__)\ + _(LIBCOLOUR_YIQ, libcolour_yiq_##RES##_t, yiq, __VA_ARGS__)\ + _(LIBCOLOUR_YDBDR, libcolour_ydbdr_##RES##_t, ydbdr, __VA_ARGS__)\ + _(LIBCOLOUR_YUV, libcolour_yuv_##RES##_t, yuv, __VA_ARGS__)\ + _(LIBCOLOUR_YPBPR, libcolour_ypbpr_##RES##_t, ypbpr, __VA_ARGS__)\ + _(LIBCOLOUR_YCGCO, libcolour_ycgco_##RES##_t, ycgco, __VA_ARGS__)\ + _(LIBCOLOUR_CIE1960UCS, libcolour_cie1960ucs_##RES##_t, cie1960ucs, __VA_ARGS__)\ + _(LIBCOLOUR_CIEUVW, libcolour_cieuvw_##RES##_t, cieuvw, __VA_ARGS__) + +#define LIBCOLOUR_LIST_MODELS(_, RES)\ + _(LIBCOLOUR_RGB, libcolour_rgb_##RES##_t, rgb)\ + _(LIBCOLOUR_SRGB, libcolour_srgb_##RES##_t, srgb)\ + _(LIBCOLOUR_CIEXYY, libcolour_ciexyy_##RES##_t, ciexyy)\ + _(LIBCOLOUR_CIEXYZ, libcolour_ciexyz_##RES##_t, ciexyz)\ + _(LIBCOLOUR_CIELAB, libcolour_cielab_##RES##_t, cielab)\ + _(LIBCOLOUR_CIELUV, libcolour_cieluv_##RES##_t, cieluv)\ + _(LIBCOLOUR_CIELCHUV, libcolour_cielchuv_##RES##_t, cielchuv)\ + _(LIBCOLOUR_YIQ, libcolour_yiq_##RES##_t, yiq)\ + _(LIBCOLOUR_YDBDR, libcolour_ydbdr_##RES##_t, ydbdr)\ + _(LIBCOLOUR_YUV, libcolour_yuv_##RES##_t, yuv)\ + _(LIBCOLOUR_YPBPR, libcolour_ypbpr_##RES##_t, ypbpr)\ + _(LIBCOLOUR_YCGCO, libcolour_ycgco_##RES##_t, ycgco)\ + _(LIBCOLOUR_CIE1960UCS, libcolour_cie1960ucs_##RES##_t, cie1960ucs)\ + _(LIBCOLOUR_CIEUVW, libcolour_cieuvw_##RES##_t, cieuvw) + + +typedef enum libcolour_model { +#define LIBCOLOUR_X(C, T, N) C, + LIBCOLOUR_LIST_MODELS(LIBCOLOUR_X,) +#undef LIBCOLOUR_X +} libcolour_model_t; + + +typedef enum libcolour_encoding_type { + LIBCOLOUR_ENCODING_TYPE_LINEAR, + LIBCOLOUR_ENCODING_TYPE_SIMPLE, + LIBCOLOUR_ENCODING_TYPE_REGULAR, + LIBCOLOUR_ENCODING_TYPE_CUSTOM +} libcolour_encoding_type_t; + + +typedef enum libcolour_rgb_colour_space { + LIBCOLOUR_RGB_COLOUR_SPACE_CUSTOM_FROM_MEASUREMENTS, + LIBCOLOUR_RGB_COLOUR_SPACE_CUSTOM_FROM_MATRIX, + LIBCOLOUR_RGB_COLOUR_SPACE_CUSTOM_FROM_INV_MATRIX, + LIBCOLOUR_RGB_COLOUR_SPACE_SRGB, + LIBCOLOUR_RGB_COLOUR_SPACE_ADOBE_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_APPLE_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_BEST_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_BETA_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_BRUCE_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_CIE_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_COLORMATCH_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_DCI_P3_D65, + LIBCOLOUR_RGB_COLOUR_SPACE_DCI_P3_THEATER, + LIBCOLOUR_RGB_COLOUR_SPACE_DON_RGB_4, + LIBCOLOUR_RGB_COLOUR_SPACE_ECI_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_ECI_RGB_V2, + LIBCOLOUR_RGB_COLOUR_SPACE_EKTA_SPACE_PS5, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_601_625_LINE, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_601_525_LINE, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_709, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2020, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_EOTF_PQ, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_OOTF_PQ, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_OETF_PQ, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_EOTF_HLG, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_OOTF_HLG, + LIBCOLOUR_RGB_COLOUR_SPACE_ITU_R_BT_2100_OETF_HLG, + LIBCOLOUR_RGB_COLOUR_SPACE_LIGHTROOM_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_NTSC_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_PAL_SECAM_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_PROPHOTO_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_SGI_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_SMPTE_240M_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_SMPTE_C_RGB, + LIBCOLOUR_RGB_COLOUR_SPACE_WIDE_GAMUT_RGB +} libcolour_rgb_colour_space_t; + + +#define LIBCOLOUR_X(C, T, N) T N; +#define LIBCOLOUR_DEF(TYPE, RES) \ +typedef struct libcolour_srgb_##RES {\ + enum libcolour_model model;\ + TYPE R;\ + TYPE G;\ + TYPE B;\ + int with_transfer;\ +} libcolour_srgb_##RES##_t;\ +\ +typedef struct libcolour_ciexyy_##RES {\ + enum libcolour_model model;\ + TYPE x;\ + TYPE y;\ + TYPE Y;\ +} libcolour_ciexyy_##RES##_t;\ +\ +typedef struct libcolour_ciexyz_##RES {\ + enum libcolour_model model;\ + TYPE X;\ + TYPE Y;\ + TYPE Z;\ +} libcolour_ciexyz_##RES##_t;\ +\ +typedef struct libcolour_cielab_##RES {\ + enum libcolour_model model;\ + TYPE L;\ + TYPE a;\ + TYPE b;\ +} libcolour_cielab_##RES##_t;\ +\ +typedef struct libcolour_yiq_##RES {\ + enum libcolour_model model;\ + TYPE Y;\ + TYPE I;\ + TYPE Q;\ +} libcolour_yiq_##RES##_t;\ +\ +typedef struct libcolour_ydbdr_##RES {\ + enum libcolour_model model;\ + TYPE Y;\ + TYPE Db;\ + TYPE Dr;\ +} libcolour_ydbdr_##RES##_t;\ +\ +typedef struct libcolour_yuv_##RES {\ + enum libcolour_model model;\ + TYPE Y;\ + TYPE U;\ + TYPE V;\ +} libcolour_yuv_##RES##_t;\ +\ +typedef struct libcolour_ypbpr_##RES {\ + enum libcolour_model model;\ + TYPE Y;\ + TYPE Pb;\ + TYPE Pr;\ +} libcolour_ypbpr_##RES##_t;\ +\ +typedef struct libcolour_ycgco_##RES {\ + enum libcolour_model model;\ + TYPE Y;\ + TYPE Cg;\ + TYPE Co;\ +} libcolour_ycgco_##RES##_t;\ +\ +typedef struct libcolour_cie1960ucs_##RES {\ + enum libcolour_model model;\ + TYPE u;\ + TYPE v;\ + TYPE Y;\ +} libcolour_cie1960ucs_##RES##_t;\ +\ +typedef struct libcolour_cieuvw_##RES {\ + enum libcolour_model model;\ + TYPE U;\ + TYPE V;\ + TYPE W;\ + TYPE u0;\ + TYPE v0;\ +} libcolour_cieuvw_##RES##_t;\ +\ +typedef struct libcolour_cieluv_##RES {\ + enum libcolour_model model;\ + TYPE L;\ + TYPE u;\ + TYPE v;\ + struct libcolour_ciexyz_##RES white;\ +} libcolour_cieluv_##RES##_t;\ +\ +typedef struct libcolour_cielchuv_##RES {\ + enum libcolour_model model;\ + TYPE L;\ + TYPE C;\ + TYPE h;\ + struct libcolour_ciexyz_##RES white;\ + TYPE one_revolution;\ +} libcolour_cielchuv_##RES##_t;\ +\ +typedef struct libcolour_rgb_##RES {\ + enum libcolour_model model;\ + TYPE R;\ + TYPE G;\ + TYPE B;\ + int with_transfer;\ + enum libcolour_encoding_type encoding_type;\ + TYPE gamma;\ + TYPE offset;\ + TYPE slope;\ + TYPE transition;\ + TYPE transitioninv;\ + TYPE (*to_encoded_red)(TYPE);\ + TYPE (*to_decoded_red)(TYPE);\ + TYPE (*to_encoded_green)(TYPE);\ + TYPE (*to_decoded_green)(TYPE);\ + TYPE (*to_encoded_blue)(TYPE);\ + TYPE (*to_decoded_blue)(TYPE);\ + struct libcolour_ciexyy_##RES red;\ + struct libcolour_ciexyy_##RES green;\ + struct libcolour_ciexyy_##RES blue;\ + struct libcolour_ciexyy_##RES white;\ + TYPE white_r;\ + TYPE white_g;\ + TYPE white_b;\ + TYPE M[3][3];\ + TYPE Minv[3][3];\ + enum libcolour_rgb_colour_space colour_space;\ +} libcolour_rgb_##RES##_t;\ +\ +\ +typedef union libcolour_colour_##RES {\ + enum libcolour_model model;\ + LIBCOLOUR_LIST_MODELS(LIBCOLOUR_X, RES)\ +} libcolour_colour_##RES##_t;\ +\ +\ +int libcolour_convert_##RES(const libcolour_colour_##RES##_t *restrict from, libcolour_colour_##RES##_t *restrict to);\ +TYPE libcolour_srgb_encode_##RES(TYPE);\ +TYPE libcolour_srgb_decode_##RES(TYPE);\ +int libcolour_delta_e_##RES(const libcolour_colour_##RES##_t *, const libcolour_colour_##RES##_t *, TYPE *);\ +int libcolour_proper_##RES(libcolour_colour_##RES##_t *);\ +int libcolour_get_rgb_colour_space_##RES(libcolour_rgb_##RES##_t *, libcolour_rgb_colour_space_t);\ +size_t libcolour_marshal_##RES(const libcolour_colour_##RES##_t *, void *);\ +size_t libcolour_unmarshal_##RES(libcolour_colour_##RES##_t *, const void *); + +LIBCOLOUR_DEF(float, f) +LIBCOLOUR_DEF(double, lf) +LIBCOLOUR_DEF(long double, llf) + +#undef LIBCOLOUR_DEF +#undef LIBCOLOUR_X + + + +#define LIBCOLOUR_GENERIC___(C, TYPE, N, CALL)\ + TYPE *: (CALL),\ + const TYPE *: (CALL), + +#define LIBCOLOUR_GENERIC__(TYPE, RES, CALL)\ + LIBCOLOUR_LIST_MODELS_N(LIBCOLOUR_GENERIC___, RES, (CALL))\ + TYPE: (CALL),\ + TYPE *: (CALL),\ + const TYPE: (CALL),\ + const TYPE *: (CALL),\ + libcolour_colour_##RES##_t *: (CALL),\ + const libcolour_colour_##RES##_t *: (CALL) + +#define LIBCOLOUR_GENERIC(FUNC, REF, ...)\ + (_Generic((REF),\ + LIBCOLOUR_GENERIC__(long double, llf, FUNC##_llf(__VA_ARGS__)),\ + LIBCOLOUR_GENERIC__(double, lf, FUNC##_lf(__VA_ARGS__)),\ + LIBCOLOUR_GENERIC__(float, f, FUNC##_f(__VA_ARGS__)))) + + +#define libcolour_convert(FROM, TO)\ + LIBCOLOUR_GENERIC(libcolour_convert, (FROM), (const void *)(FROM), (void *)(TO)) + +#define libcolour_srgb_encode(VALUE)\ + LIBCOLOUR_GENERIC(libcolour_srgb_encode, (VALUE), (VALUE)) + +#define libcolour_srgb_decode(VALUE)\ + LIBCOLOUR_GENERIC(libcolour_srgb_decode, (VALUE), (VALUE)) + +#define libcolour_delta_e(A, B, E)\ + LIBCOLOUR_GENERIC(libcolour_delta_e, (A), (const void *)(A), (const void *)(B), (void *)(E)) + +#define libcolour_proper(COLOUR)\ + LIBCOLOUR_GENERIC(libcolour_delta_e, (COLOUR), (const void *)(COLOUR)) + +#define libcolour_get_rgb_colour_space(CS, SPACE)\ + LIBCOLOUR_GENERIC(libcolour_get_rgb_colour_space, (CS), (void *)(CS), (SPACE)) + +#define libcolour_marshal(COLOUR, BUF)\ + LIBCOLOUR_GENERIC(libcolour_marshal, (COLOUR), (const void *)(COLOUR), (void *)(BUF)) + +#define libcolour_unmarshal(COLOUR, BUF)\ + LIBCOLOUR_GENERIC(libcolour_unmarshal, (COLOUR), (void *)(COLOUR), (const void *)(BUF)) + + + +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#elif defined(__clang__) +# pragma clang diagnostic pop +#endif + + +#endif |