Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
colorspaces.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2010 Henrik Andersson.
4 Copyright (C) 2010-2012, 2017 johannes hanika.
5 Copyright (C) 2010 José Carlos García Sogo.
6 Copyright (C) 2011 Bruce Guenter.
7 Copyright (C) 2011 Robert Bieber.
8 Copyright (C) 2012, 2014 Pascal de Bruijn.
9 Copyright (C) 2012 Richard Wonka.
10 Copyright (C) 2013-2017 Tobias Ellinghaus.
11 Copyright (C) 2014, 2019-2022 Pascal Obry.
12 Copyright (C) 2014-2016 Roman Lebedev.
13 Copyright (C) 2014 Ulrich Pegelow.
14 Copyright (C) 2015-2016 Pedro Côrte-Real.
15 Copyright (C) 2018-2019 Edgardo Hoszowski.
16 Copyright (C) 2019 Philippe Weyland.
17 Copyright (C) 2020, 2022-2025 Aurélien PIERRE.
18 Copyright (C) 2020 Dan Torop.
19 Copyright (C) 2021 Hubert Kowalski.
20 Copyright (C) 2021 Miloš Komarčević.
21 Copyright (C) 2021 Ralf Brown.
22 Copyright (C) 2021 Sakari Kapanen.
23 Copyright (C) 2022 Martin Bařinka.
24 Copyright (C) 2023, 2025 Alynx Zhou.
25
26 darktable is free software: you can redistribute it and/or modify
27 it under the terms of the GNU General Public License as published by
28 the Free Software Foundation, either version 3 of the License, or
29 (at your option) any later version.
30
31 darktable is distributed in the hope that it will be useful,
32 but WITHOUT ANY WARRANTY; without even the implied warranty of
33 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34 GNU General Public License for more details.
35
36 You should have received a copy of the GNU General Public License
37 along with darktable. If not, see <http://www.gnu.org/licenses/>.
38*/
39
40#pragma once
41
42#include "common/darktable.h"
43#include "common/matrices.h"
44
45#include <lcms2.h>
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51// this was removed from lcms2 in 2.4
52#ifndef TYPE_XYZA_FLT
53 #define TYPE_XYZA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
54#endif
55
56// max iccprofile file name length
57#define DT_IOP_COLOR_ICC_LEN 512
58#define LUT_SAMPLES 0x10000
59
60
61// constants fit to the ones from lcms.h:
63{
64 DT_INTENT_PERCEPTUAL = INTENT_PERCEPTUAL, // 0
65 DT_INTENT_RELATIVE_COLORIMETRIC = INTENT_RELATIVE_COLORIMETRIC, // 1
66 DT_INTENT_SATURATION = INTENT_SATURATION, // 2
67 DT_INTENT_ABSOLUTE_COLORIMETRIC = INTENT_ABSOLUTE_COLORIMETRIC, // 3
70
79
113
120
134
135/* CICP color primaries (Recommendation ITU-T H.273) */
144
145/* CICP transfer characteristics (Recommendation ITU-T H.273) */
158
159/* CICP matrix coefficients (Recommendation ITU-T H.273) */
170
194
196{
197 dt_colorspaces_color_profile_type_t type; // filename is only used for type DT_COLORSPACE_FILE
198 char filename[DT_IOP_COLOR_ICC_LEN]; // icc file name
199 char name[512]; // product name, displayed in GUI
200 cmsHPROFILE profile; // the actual profile
201 int in_pos; // position in input combo box, -1 if not applicable
202 int out_pos; // position in output combo box, -1 if not applicable
203 int display_pos; // position in display combo box, -1 if not applicable
204 int category_pos; // position in category combo box, -1 if not applicable
205 int work_pos; // position in working combo box, -1 if not applicable
207
214
215int mat3inv_float(float *const dst, const float *const src);
216int mat3inv(float *const dst, const float *const src);
217
220
223
225cmsHPROFILE dt_colorspaces_create_xyzimatrix_profile(float cam_xyz[3][3]);
226
228cmsHPROFILE dt_colorspaces_create_darktable_profile(const char *makermodel);
229
231cmsHPROFILE dt_colorspaces_create_vendor_profile(const char *makermodel);
232
234cmsHPROFILE dt_colorspaces_create_alternate_profile(const char *makermodel);
235
238
240const cmsHPROFILE dt_colorspaces_get_embedded_profile(const int32_t imgid, dt_colorspaces_color_profile_type_t *type, gboolean *new_profile);
241
242/* LCMS transform handles are not safe to rediscover indirectly from mutable owner
243 * structs inside OpenMP regions. Alias the cmsHTRANSFORM to a local variable before
244 * entering a parallel region, declare that alias shared there, and pass only that
245 * stable handle to these helpers. */
246void dt_colorspaces_transform_rgba_float_row(const cmsHTRANSFORM transform, const float *in, float *out,
247 const int width);
248void dt_colorspaces_transform_rgba_float_image(const cmsHTRANSFORM transform, const float *image_in, float *image_out,
249 const int width, const int height);
250void dt_colorspaces_transform_rgba8_to_bgra8(const cmsHTRANSFORM transform, const uint8_t *image_in, uint8_t *image_out,
251 const int width, const int height);
252
256 const char *over_filename);
257
260cmsHPROFILE dt_colorspaces_get_rgb_profile_from_mem(uint8_t *data, uint32_t size);
261
263void dt_colorspaces_cleanup_profile(cmsHPROFILE p);
264
267int dt_colorspaces_get_matrix_from_input_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg,
268 float *lutb, const int lutsize);
269
271int dt_colorspaces_get_matrix_from_output_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg,
272 float *lutb, const int lutsize);
273
275void dt_colorspaces_get_profile_name(cmsHPROFILE p, const char *language, const char *country, char *name,
276 size_t len);
277
279const char *dt_colorspaces_get_name(dt_colorspaces_color_profile_type_t type, const char *filename);
280
282void rgb2hsl(const dt_aligned_pixel_t rgb, float *h, float *s, float *l);
283void hsl2rgb(dt_aligned_pixel_t rgb, float h, float s, float l);
284
287
293
297gboolean dt_colorspaces_is_profile_equal(const char *fullname, const char *filename);
298
301
305
307int dt_colorspaces_conversion_matrices_xyz(const float adobe_XYZ_to_CAM[4][3], float in_XYZ_to_CAM[9], double XYZ_to_CAM[4][3], double CAM_to_XYZ[3][4]);
308
310int dt_colorspaces_conversion_matrices_rgb(const float adobe_XYZ_to_CAM[4][3], double RGB_to_CAM[4][3], double CAM_to_RGB[3][4], const float *embedded_matrix, double mul[4]);
311
313// FIXME: CRITICAL: why is this function NOT used anywhere ???
314void dt_colorspaces_cygm_apply_coeffs_to_rgb(float *out, const float *in, int num, double RGB_to_CAM[4][3], double CAM_to_RGB[3][4], dt_aligned_pixel_t coeffs);
315
317void dt_colorspaces_cygm_to_rgb(float *out, int num, double CAM_to_RGB[3][4]);
318
320void dt_colorspaces_rgb_to_cygm(float *out, int num, double RGB_to_CAM[4][3]);
321
322
324{
325 // Remap unused colorspaces to valid ones
326 if(colorspace == DT_COLORSPACE_DISPLAY2)
328 else
330}
331
339
344
349
350
361dt_colorspaces_color_profile_type_t dt_image_find_best_color_profile(int32_t imgid, cmsHPROFILE *output, gboolean *new_profile);
362
374 int32_t imgid,
376 cmsHPROFILE *output,
377 gboolean *new_profile);
378
379#ifdef __cplusplus
380}
381#endif
382
383// clang-format off
384// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
385// vim: shiftwidth=2 expandtab tabstop=2 cindent
386// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
387// clang-format on
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
Definition chromatic_adaptation.h:315
static void transform(float *x, float *o, const float *m, const float t_h, const float t_v)
Definition clipping.c:492
static dt_colorspaces_color_profile_type_t sanitize_colorspaces(dt_colorspaces_color_profile_type_t colorspace)
Definition colorspaces.h:323
cmsHPROFILE dt_colorspaces_create_xyzimatrix_profile(float cam_xyz[3][3])
Definition colorspaces.c:1302
dt_iop_color_intent_t
Definition colorspaces.h:63
@ DT_INTENT_ABSOLUTE_COLORIMETRIC
Definition colorspaces.h:67
@ DT_INTENT_RELATIVE_COLORIMETRIC
Definition colorspaces.h:65
@ DT_INTENT_PERCEPTUAL
Definition colorspaces.h:64
@ DT_INTENT_SATURATION
Definition colorspaces.h:66
@ DT_INTENT_LAST
Definition colorspaces.h:68
const dt_colorspaces_color_profile_t * dt_colorspaces_get_profile(dt_colorspaces_color_profile_type_t type, const char *filename, dt_colorspaces_profile_direction_t direction)
Definition colorspaces.c:2519
void dt_colorspaces_rgb_to_cygm(float *out, int num, double RGB_to_CAM[4][3])
Definition colorspaces.c:2718
dt_colorspaces_color_profile_type_t dt_colorspaces_get_input_profile_from_image(int32_t imgid, dt_colorspaces_color_profile_type_t requested, cmsHPROFILE *output, gboolean *new_profile)
Resolve an embedded/matrix input profile for a given image, honoring the requested type when possible...
Definition colorspaces.c:1070
void rgb2hsl(const dt_aligned_pixel_t rgb, float *h, float *s, float *l)
Definition colorspaces.c:1414
void dt_colorspaces_transform_rgba_float_image(const cmsHTRANSFORM transform, const float *image_in, float *image_out, const int width, const int height)
Definition colorspaces.c:1549
int dt_colorspaces_conversion_matrices_rgb(const float adobe_XYZ_to_CAM[4][3], double RGB_to_CAM[4][3], double CAM_to_RGB[3][4], const float *embedded_matrix, double mul[4])
Definition colorspaces.c:2589
const dt_colorspaces_color_profile_t * dt_colorspaces_get_output_profile(const int32_t imgid, dt_colorspaces_color_profile_type_t *over_type, const char *over_filename)
Definition colorspaces.c:1206
int dt_colorspaces_get_matrix_from_output_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg, float *lutb, const int lutsize)
Definition colorspaces.c:322
void dt_colorspaces_update_display_transforms()
Definition colorspaces.c:1538
static gboolean dt_colorspaces_is_matrix_profile_type(const dt_colorspaces_color_profile_type_t type)
Definition colorspaces.h:340
const cmsHPROFILE dt_colorspaces_get_embedded_profile(const int32_t imgid, dt_colorspaces_color_profile_type_t *type, gboolean *new_profile)
Definition colorspaces.c:1175
#define DT_IOP_COLOR_ICC_LEN
Definition colorspaces.h:57
cmsHPROFILE dt_colorspaces_create_vendor_profile(const char *makermodel)
Definition colorspaces.c:592
int dt_colorspaces_get_matrix_from_input_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg, float *lutb, const int lutsize)
Definition colorspaces.c:316
dt_colorspaces_color_profile_type_t
Definition colorspaces.h:81
@ DT_COLORSPACE_ADOBERGB
Definition colorspaces.h:85
@ DT_COLORSPACE_PROPHOTO_RGB
Definition colorspaces.h:104
@ DT_COLORSPACE_EMBEDDED_MATRIX
Definition colorspaces.h:93
@ DT_COLORSPACE_EMBEDDED_ICC
Definition colorspaces.h:92
@ DT_COLORSPACE_FILE
Definition colorspaces.h:83
@ DT_COLORSPACE_DISPLAY
Definition colorspaces.h:91
@ DT_COLORSPACE_SRGB
Definition colorspaces.h:84
@ DT_COLORSPACE_INFRARED
Definition colorspaces.h:90
@ DT_COLORSPACE_EXPORT
Definition colorspaces.h:99
@ DT_COLORSPACE_LAB
Definition colorspaces.h:89
@ DT_COLORSPACE_REC709
Definition colorspaces.h:103
@ DT_COLORSPACE_HLG_P3
Definition colorspaces.h:108
@ DT_COLORSPACE_PQ_P3
Definition colorspaces.h:107
@ DT_COLORSPACE_PQ_REC2020
Definition colorspaces.h:105
@ DT_COLORSPACE_DISPLAY2
Definition colorspaces.h:102
@ DT_COLORSPACE_NONE
Definition colorspaces.h:82
@ DT_COLORSPACE_HLG_REC2020
Definition colorspaces.h:106
@ DT_COLORSPACE_WORK
Definition colorspaces.h:101
@ DT_COLORSPACE_LAST
Definition colorspaces.h:111
@ DT_COLORSPACE_ENHANCED_MATRIX
Definition colorspaces.h:95
@ DT_COLORSPACE_LIN_REC2020
Definition colorspaces.h:87
@ DT_COLORSPACE_DISPLAY_P3
Definition colorspaces.h:110
@ DT_COLORSPACE_STANDARD_MATRIX
Definition colorspaces.h:94
@ DT_COLORSPACE_XYZ
Definition colorspaces.h:88
@ DT_COLORSPACE_BRG
Definition colorspaces.h:98
@ DT_COLORSPACE_VENDOR_MATRIX
Definition colorspaces.h:96
@ DT_COLORSPACE_SOFTPROOF
Definition colorspaces.h:100
@ DT_COLORSPACE_ITUR_BT1886
Definition colorspaces.h:109
@ DT_COLORSPACE_LIN_REC709
Definition colorspaces.h:86
@ DT_COLORSPACE_ALTERNATE_MATRIX
Definition colorspaces.h:97
int mat3inv(float *const dst, const float *const src)
Definition colorspaces.c:191
dt_colorspaces_profile_type_t
Definition colorspaces.h:72
@ DT_COLORSPACES_PROFILE_TYPE_DISPLAY
Definition colorspaces.h:76
@ DT_COLORSPACES_PROFILE_TYPE_EXPORT
Definition colorspaces.h:75
@ DT_COLORSPACES_PROFILE_TYPE_SOFTPROOF
Definition colorspaces.h:77
@ DT_COLORSPACES_PROFILE_TYPE_INPUT
Definition colorspaces.h:73
@ DT_COLORSPACES_PROFILE_TYPE_WORK
Definition colorspaces.h:74
dt_colorspaces_profile_direction_t
Definition colorspaces.h:122
@ DT_PROFILE_DIRECTION_CATEGORY
Definition colorspaces.h:126
@ DT_PROFILE_DIRECTION_DISPLAY2
Definition colorspaces.h:128
@ DT_PROFILE_DIRECTION_IN
Definition colorspaces.h:123
@ DT_PROFILE_DIRECTION_OUT
Definition colorspaces.h:124
@ DT_PROFILE_DIRECTION_DISPLAY
Definition colorspaces.h:125
@ DT_PROFILE_DIRECTION_WORK
Definition colorspaces.h:127
@ DT_PROFILE_DIRECTION_ANY
Definition colorspaces.h:129
void dt_colorspaces_cleanup(dt_colorspaces_t *self)
Definition colorspaces.c:1904
cmsHPROFILE dt_colorspaces_create_darktable_profile(const char *makermodel)
Definition colorspaces.c:642
int dt_colorspaces_conversion_matrices_xyz(const float adobe_XYZ_to_CAM[4][3], float in_XYZ_to_CAM[9], double XYZ_to_CAM[4][3], double CAM_to_XYZ[3][4])
Definition colorspaces.c:2558
dt_colorspaces_cicp_transfer_characteristics_t
Definition colorspaces.h:147
@ DT_CICP_TRANSFER_CHARACTERISTICS_UNSPECIFIED
Definition colorspaces.h:149
@ DT_CICP_TRANSFER_CHARACTERISTICS_LINEAR
Definition colorspaces.h:151
@ DT_CICP_TRANSFER_CHARACTERISTICS_HLG
Definition colorspaces.h:156
@ DT_CICP_TRANSFER_CHARACTERISTICS_REC2020_12B
Definition colorspaces.h:154
@ DT_CICP_TRANSFER_CHARACTERISTICS_REC709
Definition colorspaces.h:148
@ DT_CICP_TRANSFER_CHARACTERISTICS_PQ
Definition colorspaces.h:155
@ DT_CICP_TRANSFER_CHARACTERISTICS_REC2020_10B
Definition colorspaces.h:153
@ DT_CICP_TRANSFER_CHARACTERISTICS_REC601
Definition colorspaces.h:150
@ DT_CICP_TRANSFER_CHARACTERISTICS_SRGB
Definition colorspaces.h:152
void dt_colorspaces_cleanup_profile(cmsHPROFILE p)
Definition colorspaces.c:1365
dt_colorspaces_color_profile_type_t dt_image_find_best_color_profile(int32_t imgid, cmsHPROFILE *output, gboolean *new_profile)
Best effort to find a suitable (input) color profile for a given image, using embedded ICC or EXIF wh...
Definition colorspaces.c:880
const dt_colorspaces_color_profile_t * dt_colorspaces_get_work_profile(const int32_t imgid)
Definition colorspaces.c:830
dt_colorspaces_t * dt_colorspaces_init()
Definition colorspaces.c:1713
cmsHPROFILE dt_colorspaces_get_rgb_profile_from_mem(uint8_t *data, uint32_t size)
Definition colorspaces.c:1358
const char * dt_colorspaces_get_name(dt_colorspaces_color_profile_type_t type, const char *filename)
Definition colorspaces.c:1939
void dt_colorspaces_get_profile_name(cmsHPROFILE p, const char *language, const char *country, char *name, size_t len)
Definition colorspaces.c:1371
dt_colorspaces_color_mode_t
Definition colorspaces.h:115
@ DT_PROFILE_GAMUTCHECK
Definition colorspaces.h:118
@ DT_PROFILE_SOFTPROOF
Definition colorspaces.h:117
@ DT_PROFILE_NORMAL
Definition colorspaces.h:116
void dt_colorspaces_set_display_profile(const dt_colorspaces_color_profile_type_t profile_type)
Definition colorspaces.c:2081
cmsHPROFILE dt_colorspaces_create_alternate_profile(const char *makermodel)
Definition colorspaces.c:542
void hsl2rgb(dt_aligned_pixel_t rgb, float h, float s, float l)
Definition colorspaces.c:1458
gboolean dt_colorspaces_is_profile_equal(const char *fullname, const char *filename)
Definition colorspaces.c:2252
static gboolean dt_colorspaces_is_raw_matrix_profile_type(const dt_colorspaces_color_profile_type_t type)
Definition colorspaces.h:332
dt_colorspaces_color_profile_type_t dt_colorspaces_cicp_to_type(const dt_colorspaces_cicp_t *cicp, const char *filename)
Definition colorspaces.c:2262
void dt_colorspaces_transform_rgba8_to_bgra8(const cmsHTRANSFORM transform, const uint8_t *image_in, uint8_t *image_out, const int width, const int height)
Definition colorspaces.c:1567
void dt_colorspaces_cygm_apply_coeffs_to_rgb(float *out, const float *in, int num, double RGB_to_CAM[4][3], double CAM_to_RGB[3][4], dt_aligned_pixel_t coeffs)
Definition colorspaces.c:2669
dt_colorspaces_cicp_color_primaries_t
Definition colorspaces.h:137
@ DT_CICP_COLOR_PRIMARIES_REC2020
Definition colorspaces.h:140
@ DT_CICP_COLOR_PRIMARIES_UNSPECIFIED
Definition colorspaces.h:139
@ DT_CICP_COLOR_PRIMARIES_P3
Definition colorspaces.h:142
@ DT_CICP_COLOR_PRIMARIES_REC709
Definition colorspaces.h:138
@ DT_CICP_COLOR_PRIMARIES_XYZ
Definition colorspaces.h:141
int mat3inv_float(float *const dst, const float *const src)
Definition colorspaces.c:189
void dt_colorspaces_transform_rgba_float_row(const cmsHTRANSFORM transform, const float *in, float *out, const int width)
Definition colorspaces.c:1543
static gboolean dt_colorspaces_is_embedded_or_matrix_profile_type(const dt_colorspaces_color_profile_type_t type)
Definition colorspaces.h:345
dt_colorspaces_cicp_matrix_coefficients_t
Definition colorspaces.h:161
@ DT_CICP_MATRIX_COEFFICIENTS_REC601
Definition colorspaces.h:166
@ DT_CICP_MATRIX_COEFFICIENTS_REC2020_NCL
Definition colorspaces.h:167
@ DT_CICP_MATRIX_COEFFICIENTS_UNSPECIFIED
Definition colorspaces.h:164
@ DT_CICP_MATRIX_COEFFICIENTS_IDENTITY
Definition colorspaces.h:162
@ DT_CICP_MATRIX_COEFFICIENTS_SYCC
Definition colorspaces.h:165
@ DT_CICP_MATRIX_COEFFICIENTS_REC709
Definition colorspaces.h:163
@ DT_CICP_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL
Definition colorspaces.h:168
void dt_colorspaces_cygm_to_rgb(float *out, int num, double CAM_to_RGB[3][4])
Definition colorspaces.c:2701
const float h
Definition colorspaces_inline_conversions.h:1366
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
static dt_aligned_pixel_t rgb
Definition colorspaces_inline_conversions.h:530
static const dt_colormatrix_t matrix
Definition colorspaces_inline_conversions.h:182
int type
Definition common/metadata.c:62
char * name
Definition common/metadata.c:61
static const float const int lutsize
Definition iop_profile.h:224
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:33
size_t size
Definition mipmap_cache.c:3
Definition colorspaces.h:209
dt_colorspaces_cicp_matrix_coefficients_t matrix_coefficients
Definition colorspaces.h:212
dt_colorspaces_cicp_transfer_characteristics_t transfer_characteristics
Definition colorspaces.h:211
dt_colorspaces_cicp_color_primaries_t color_primaries
Definition colorspaces.h:210
Definition colorspaces.h:196
cmsHPROFILE profile
Definition colorspaces.h:200
int work_pos
Definition colorspaces.h:205
int display_pos
Definition colorspaces.h:203
dt_colorspaces_color_profile_type_t type
Definition colorspaces.h:197
int out_pos
Definition colorspaces.h:202
char filename[512]
Definition colorspaces.h:198
int in_pos
Definition colorspaces.h:201
char name[512]
Definition colorspaces.h:199
int category_pos
Definition colorspaces.h:204
Definition colorspaces.h:172
GList * profiles
Definition colorspaces.h:173
cmsHTRANSFORM transform_adobe_rgb_to_display
Definition colorspaces.h:191
dt_colorspaces_color_profile_type_t softproof_type
Definition colorspaces.h:183
gchar * colord_profile_file
Definition colorspaces.h:177
cmsHTRANSFORM transform_srgb_to_display
Definition colorspaces.h:191
cmsHTRANSFORM transform_xyz_to_display
Definition colorspaces.h:191
pthread_rwlock_t xprofile_lock
Definition colorspaces.h:176
dt_colorspaces_color_mode_t mode
Definition colorspaces.h:189
int xprofile_size
Definition colorspaces.h:179
char softproof_filename[512]
Definition colorspaces.h:185
uint8_t * xprofile_data
Definition colorspaces.h:178
dt_colorspaces_color_profile_type_t display_type
Definition colorspaces.h:182
char display_filename[512]
Definition colorspaces.h:184
dt_iop_color_intent_t softproof_intent
Definition colorspaces.h:187
dt_iop_color_intent_t display_intent
Definition colorspaces.h:186
#define MIN(a, b)
Definition thinplate.c:32