colour.h - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
colour.h (5369B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <math.h> | |
3 | |
4 #define D65_XYY_X 0.312726871026564878786047074755 | |
5 #define D65_XYY_Y 0.329023206641284038376227272238 | |
6 | |
7 #define D65_XYZ_X (D65_XYY_X / D65_XYY_Y) | |
8 #define D65_XYZ_Z (1 / D65_XYY_Y - 1 - D65_XYZ_X) | |
9 | |
10 #define SRGB_ENCODE(TYPE, NAME_SUFFIX, MATH_SUFFIX)\ | |
11 static inline TYPE\ | |
12 srgb_encode##NAME_SUFFIX(TYPE t)\ | |
13 {\ | |
14 TYPE sign = 1;\ | |
15 if (t < 0) {\ | |
16 t = -t;\ | |
17 sign = -1;\ | |
18 }\ | |
19 t = t <= (TYPE)0.0031306684425217108\ | |
20 ? (TYPE)12.92 * t\ | |
21 : (TYPE)1.055 * pow##MATH_SUFFIX(t, (TYPE)1.0 / … | |
22 return t * sign;\ | |
23 } | |
24 SRGB_ENCODE(double, _d,) | |
25 SRGB_ENCODE(float, _f, f) | |
26 #undef SRGB_ENCODE | |
27 | |
28 #define SRGB_DECODE(TYPE, NAME_SUFFIX, MATH_SUFFIX)\ | |
29 static inline TYPE\ | |
30 srgb_decode##NAME_SUFFIX(TYPE t)\ | |
31 {\ | |
32 TYPE sign = 1;\ | |
33 if (t < 0) {\ | |
34 t = -t;\ | |
35 sign = -1;\ | |
36 }\ | |
37 t = t <= (TYPE)0.0031306684425217108 * (TYPE)12.92\ | |
38 ? t / (TYPE)12.92\ | |
39 : pow##MATH_SUFFIX((t + (TYPE)0.055) / (TYPE)1.0… | |
40 return t * sign;\ | |
41 } | |
42 SRGB_DECODE(double, _d,) | |
43 SRGB_DECODE(float, _f, f) | |
44 #undef SRGB_DECODE | |
45 | |
46 | |
47 #define MATRIX_MULTIPLY_FUNCTION(FUNCTION, TYPE, R1C1, R1C2, R1C3, R2C1,… | |
48 static inline void\ | |
49 FUNCTION(TYPE ia, TYPE ib, TYPE ic, TYPE *oa, TYPE *ob, TYPE *oc… | |
50 {\ | |
51 *oa = (TYPE)(R1C1) * ia + (TYPE)(R1C2) * ib + (TYPE)(R1C… | |
52 *ob = (TYPE)(R2C1) * ia + (TYPE)(R2C2) * ib + (TYPE)(R2C… | |
53 *oc = (TYPE)(R3C1) * ia + (TYPE)(R3C2) * ib + (TYPE)(R3C… | |
54 } | |
55 #define MATRIX_MULTIPLY_FUNCTIONS(FUNCTION_BASE, ...)\ | |
56 MATRIX_MULTIPLY_FUNCTION(FUNCTION_BASE##_d, double, __VA_ARGS__)\ | |
57 MATRIX_MULTIPLY_FUNCTION(FUNCTION_BASE##_f, float, __VA_ARGS__) | |
58 | |
59 MATRIX_MULTIPLY_FUNCTIONS(yuv_to_srgb, | |
60 0.9998394605874789675681313383392989635467529… | |
61 -0.0011131462925777491079770697979256510734558… | |
62 1.5956196024979483194528029343928210437297821… | |
63 0.9998394605876228524721227586269378662109375… | |
64 -0.3912437451399455312639474868774414062500000… | |
65 -0.8130420103656186281426698769791983067989349… | |
66 0.9998394605875743357259466392861213535070419… | |
67 2.0174178677237781798226023965980857610702514… | |
68 0.0011581972192616640793261240105493925511837… | |
69 | |
70 MATRIX_MULTIPLY_FUNCTIONS(srgb_to_yuv, | |
71 0.2990615856704488817463527539075585082173347… | |
72 0.5870798544208948310796358782681636512279510… | |
73 0.1140191250981231751993050238525029271841049… | |
74 -0.1484681372549019606754683309191022999584674… | |
75 -0.2907475490196078649063338161795400083065032… | |
76 0.4392156862745097978262265314697287976741790… | |
77 0.4392156862745097978262265314697287976741790… | |
78 -0.3680759803921568873441572122828802093863487… | |
79 -0.0711397058823529382376449348157620988786220… | |
80 | |
81 MATRIX_MULTIPLY_FUNCTIONS(ciexyz_to_srgb, | |
82 3.240446254647737500675930277794, | |
83 -1.537134761820080575134284117667, | |
84 -0.498530193022728718155178739835, | |
85 -0.969266606244679751469561779231, | |
86 1.876011959788370209167851498933, | |
87 0.041556042214430065351304932619, | |
88 0.055643503564352832235773149705, | |
89 -0.204026179735960239147729566866, | |
90 1.057226567722703292062647051353) | |
91 | |
92 MATRIX_MULTIPLY_FUNCTIONS(srgb_to_ciexyz, | |
93 0.412457445582367576708548995157, | |
94 0.357575865245515878143578447634, | |
95 0.180437247826399665973085006954, | |
96 0.212673370378408277403536885686, | |
97 0.715151730491031756287156895269, | |
98 0.072174899130559869164791564344, | |
99 0.019333942761673460208893260415, | |
100 0.119191955081838593666354597644, | |
101 0.950302838552371742508739771438) | |
102 | |
103 MATRIX_MULTIPLY_FUNCTIONS(scaled_yuv_to_ciexyz, | |
104 0.0000145009227232664705245415021073185357636… | |
105 0.0000034128157717418533674232691138561435195… | |
106 0.0000056093685351140681549461132482381486852… | |
107 0.0000152565722222869366430254151056900013827… | |
108 -0.0000020512466139801788471278606168501923434… | |
109 -0.0000036929733608348407281540479174530844375… | |
110 0.0000166117942545252278104851717532852717340… | |
111 0.0000285420507795943411387395993727977838716… | |
112 -0.0000009911926544591312073011158886859384153… | |
113 | |
114 MATRIX_MULTIPLY_FUNCTIONS(ciexyz_to_scaled_yuv, | |
115 26633.45812403910895227454602718353271484375 … | |
116 40527.367131481194519437849521636962890625 … | |
117 -272.000824317600745416712015867233276367187… | |
118 -11458.90154486896426533348858356475830078125, | |
119 -26662.3801805758339469321072101593017578125, | |
120 34490.0235254608633113093674182891845703125, | |
121 116394.099928013441967777907848358154296875, | |
122 -88546.58492295184987597167491912841796875, | |
123 -20281.0410136536011123098433017730712890625) | |
124 | |
125 #undef MATRIX_MULTIPLY_FUNCTIONS | |
126 #undef MATRIX_MULTIPLY_FUNCTION |