1 /* babl - dynamically extendable universal pixel conversion library.
2 * Copyright (C) 2012, Øyvind Kolås
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 3 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, see
16 * <https://www.gnu.org/licenses/>.
24 #include "babl-internal.h"
25 #include "babl-cpuaccel.h"
26 #include "extensions/util.h"
27 #include "base/util.h"
31 conv_rgbaD_linear_rgbAD_gamma (const Babl
*conversion
,
36 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
37 const Babl
**trc
= (void*)space
->space
.trc
;
39 double *fsrc
= (double *) src
;
40 double *fdst
= (double *) dst
;
45 double alpha
= fsrc
[3];
46 double used_alpha
= babl_epsilon_for_zero (alpha
);
47 *fdst
++ = babl_trc_from_linear (trc
[0], *fsrc
++) * used_alpha
;
48 *fdst
++ = babl_trc_from_linear (trc
[1], *fsrc
++) * used_alpha
;
49 *fdst
++ = babl_trc_from_linear (trc
[2], *fsrc
++) * used_alpha
;
56 conv_rgbAD_linear_rgbAD_gamma (const Babl
*conversion
,
61 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
62 const Babl
**trc
= (void*)space
->space
.trc
;
64 double *fsrc
= (double *) src
;
65 double *fdst
= (double *) dst
;
70 double alpha
= fsrc
[3];
81 double alpha_recip
= 1.0 / alpha
;
82 *fdst
++ = babl_trc_from_linear (trc
[0], *fsrc
++ * alpha_recip
) * alpha
;
83 *fdst
++ = babl_trc_from_linear (trc
[1], *fsrc
++ * alpha_recip
) * alpha
;
84 *fdst
++ = babl_trc_from_linear (trc
[2], *fsrc
++ * alpha_recip
) * alpha
;
91 conv_rgbaD_linear_rgbaD_gamma (const Babl
*conversion
,
96 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
97 const Babl
**trc
= (void*)space
->space
.trc
;
99 double *fsrc
= (double *) src
;
100 double *fdst
= (double *) dst
;
105 *fdst
++ = babl_trc_from_linear (trc
[0], *fsrc
++);
106 *fdst
++ = babl_trc_from_linear (trc
[1], *fsrc
++);
107 *fdst
++ = babl_trc_from_linear (trc
[2], *fsrc
++);
112 #define conv_rgbaD_linear_rgbD_linear conv_rgbaD_gamma_rgbD_gamma
115 conv_rgbaD_linear_rgbD_linear (const Babl
*conversion
,
120 double *fsrc
= (double *) src
;
121 double *fdst
= (double *) dst
;
135 conv_rgbD_linear_rgbD_gamma (const Babl
*conversion
,
140 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
141 const Babl
**trc
= (void*)space
->space
.trc
;
142 double *fsrc
= (double *) src
;
143 double *fdst
= (double *) dst
;
148 *fdst
++ = babl_trc_from_linear (trc
[0], *fsrc
++);
149 *fdst
++ = babl_trc_from_linear (trc
[1], *fsrc
++);
150 *fdst
++ = babl_trc_from_linear (trc
[2], *fsrc
++);
156 conv_rgbaD_gamma_rgbaD_linear (const Babl
*conversion
,
161 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
162 const Babl
**trc
= (void*)space
->space
.trc
;
163 double *fsrc
= (double *) src
;
164 double *fdst
= (double *) dst
;
169 *fdst
++ = babl_trc_to_linear (trc
[0], *fsrc
++);
170 *fdst
++ = babl_trc_to_linear (trc
[1], *fsrc
++);
171 *fdst
++ = babl_trc_to_linear (trc
[2], *fsrc
++);
177 conv_rgbD_gamma_rgbD_linear (const Babl
*conversion
,
182 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
183 const Babl
**trc
= (void*)space
->space
.trc
;
184 double *fsrc
= (double *) src
;
185 double *fdst
= (double *) dst
;
190 *fdst
++ = babl_trc_to_linear (trc
[0], *fsrc
++);
191 *fdst
++ = babl_trc_to_linear (trc
[1], *fsrc
++);
192 *fdst
++ = babl_trc_to_linear (trc
[2], *fsrc
++);
198 conv_rgbD_linear_rgbaD_linear (const Babl
*conversion
,
203 const Babl
*space
= babl_conversion_get_destination_space (conversion
);
204 const Babl
**trc
= (void*)space
->space
.trc
;
205 double *fsrc
= (double *) src
;
206 double *fdst
= (double *) dst
;
211 *fdst
++ = babl_trc_to_linear (trc
[0], *fsrc
++);
212 *fdst
++ = babl_trc_to_linear (trc
[1], *fsrc
++);
213 *fdst
++ = babl_trc_to_linear (trc
[2], *fsrc
++);
219 #define conv_rgbD_gamma_rgbaD_gamma conv_rgbD_linear_rgbaD_linear
221 #define o(src, dst) \
222 babl_conversion_new (src, dst, "linear", conv_ ## src ## _ ## dst, NULL)
225 #include "babl-verify-cpu.inc"
232 const Babl
*rgbaD_linear
= babl_format_new (
234 babl_type ("double"),
235 babl_component ("R"),
236 babl_component ("G"),
237 babl_component ("B"),
238 babl_component ("A"),
240 const Babl
*rgbAD_linear
= babl_format_new (
241 babl_model ("RaGaBaA"),
242 babl_type ("double"),
243 babl_component ("Ra"),
244 babl_component ("Ga"),
245 babl_component ("Ba"),
246 babl_component ("A"),
248 const Babl
*rgbaD_gamma
= babl_format_new (
249 babl_model ("R'G'B'A"),
250 babl_type ("double"),
251 babl_component ("R'"),
252 babl_component ("G'"),
253 babl_component ("B'"),
254 babl_component ("A"),
256 const Babl
*rgbAD_gamma
= babl_format_new (
257 babl_model ("R'aG'aB'aA"),
258 babl_type ("double"),
259 babl_component ("R'a"),
260 babl_component ("G'a"),
261 babl_component ("B'a"),
262 babl_component ("A"),
264 const Babl
*rgbD_linear
= babl_format_new (
266 babl_type ("double"),
267 babl_component ("R"),
268 babl_component ("G"),
269 babl_component ("B"),
271 const Babl
*rgbD_gamma
= babl_format_new (
272 babl_model ("R'G'B'"),
273 babl_type ("double"),
274 babl_component ("R'"),
275 babl_component ("G'"),
276 babl_component ("B'"),
279 o (rgbAD_linear
, rgbAD_gamma
);
280 o (rgbaD_linear
, rgbAD_gamma
);
281 o (rgbaD_linear
, rgbaD_gamma
);
282 o (rgbaD_gamma
, rgbaD_linear
);
283 o (rgbD_linear
, rgbD_gamma
);
284 o (rgbD_gamma
, rgbD_linear
);
285 o (rgbaD_linear
, rgbD_linear
);
286 o (rgbaD_gamma
, rgbD_gamma
);
289 o (rgbD_linear
, rgbaD_linear
);
290 o (rgbD_gamma
, rgbaD_gamma
);
291 o (rgbaD_linear
, rgbD_linear
);
292 o (rgbaD_gamma
, rgbD_gamma
);