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#ifndef DT_COLORPROFILES_COLORSPACES_H
41#define DT_COLORPROFILES_COLORSPACES_H
42
83#include "math/matrices.h"
84#include "system/simd.h"
85
86#include <glib.h>
87#include <lcms2.h>
88#include <pthread.h>
89
98typedef struct _GtkWidget GtkWidget;
99#include <stdint.h>
100
101#ifdef __cplusplus
102extern "C" {
103#endif
104
108#define LUT_SAMPLES 0x10000
109
114#ifndef TYPE_XYZA_FLT
115 #define TYPE_XYZA_FLT (FLOAT_SH(1)|COLORSPACE_SH(PT_XYZ)|EXTRA_SH(1)|CHANNELS_SH(3)|BYTES_SH(4))
116#endif
117
118
182
244
260
272int mat3inv_float(float *const dst, const float *const src);
273
275int mat3inv(float *const dst, const float *const src);
276
277
278/* --- lifecycle ----------------------------------------------------------- */
279
297void dt_colorprofiles_init(void);
298
311void dt_colorprofiles_cleanup(void);
312
313
314
315/* --- CRUDE: the metadata half ------------------------------------------------
316 *
317 * Everything here answers a question ABOUT a profile and answers it with plain values.
318 * No cmsHPROFILE crosses this boundary, and no caller iterates the list: enumeration
319 * hands back a value array, everything else is a lookup.
320 *
321 * THE ROLE PREDICATE. `role` is mandatory and is not a nicety.
322 * DT_COLORSPACE_SRGB is registered TWICE -- a v4 parametric-curve profile valid only as
323 * input, and a v2 point-TRC profile valid for output/monitor/working -- and nothing else
324 * distinguishes them. A multi-bit mask resolves to the first match in registration order,
325 * which for sRGB is the v4 input entry; that is what DT_PROFILE_ROLE_ANY does.
326 *
327 * The predicate tests the entry's role mask, and the three NULL-profile category entries
328 * have an empty one -- which is what makes them unreachable (see
329 * dt_colorspaces_color_profile_t). MONITOR is not an optical direction at all; it is the eligibility
330 * list for the monitor-profile menu, and it diverges from OUTPUT on 5 of the 21 built-in
331 * entries.
332 *
333 * The index-valued calls REQUIRE a single-bit role and return -1 / FALSE otherwise:
334 * an index means nothing outside the enumeration that produced it, and an index taken from
335 * INPUT|OUTPUT equals neither menu's row number.
336 *
337 * None of these takes a lock, deliberately: the list is built once at init and the only
338 * datum that mutates afterwards is the DT_COLORSPACE_DISPLAY entry's cmsHPROFILE, which
339 * none of them reads. Adding a lock would put one on every call site to protect fields
340 * nobody writes. */
341
355
356/* --- LOCK: pin ONE profile's handle while deriving from it ------------------
357 *
358 * Per profile, not per module: several pipelines and the GUI derive from profiles at the
359 * same time, and a module-wide lock would make a thumbnail conversion against sRGB stand
360 * between a monitor-profile change and the display entry.
361 *
362 * Hold this across "resolve a profile, then derive from it" -- a matrix extraction, a
363 * cmsCreateTransform -- and release once the derived artifact no longer refers to the
364 * profile. An LCMS transform does not retain its source profiles, so that is the create
365 * call, not the transform's lifetime.
366 *
367 * Read ::dt_colorspaces_color_profile_t::profile only AFTER taking the lock: the entry
368 * pointer is stable for the life of the process, but its handle is not. */
371
393
410 const char *const filename);
411
425 const int index,
427
440 const char *const filename);
441
449cmsHPROFILE dt_colorspaces_create_xyzimatrix_profile(float cam_xyz[3][3]);
450
458cmsHPROFILE dt_colorspaces_create_darktable_profile(const char *makermodel);
459
466cmsHPROFILE dt_colorspaces_create_vendor_profile(const char *makermodel);
467
474cmsHPROFILE dt_colorspaces_create_alternate_profile(const char *makermodel);
475
496void dt_colorspaces_transform_rgba_float_row(const cmsHTRANSFORM transform, const float *in, float *out,
497 const int width);
498
512void dt_colorspaces_transform_rgba_float_image(const cmsHTRANSFORM transform, const float *image_in, float *image_out,
513 const int width, const int height);
514
515
516/* --- prepared display transforms: the cmsHTRANSFORM never leaves the module ---
517 *
518 * The four cached transforms are deleted and rebuilt whenever the monitor profile or
519 * the display intent changes, so a borrowed handle can be freed under its user. These
520 * functions take the read lock internally, for the whole conversion -- which is what
521 * keeps the handle alive while the pixels are being converted. */
522
537
562gboolean dt_colorprofiles_rgba8_to_display_bgra8(const uint8_t *const in, uint8_t *const out,
563 const int width, const int height,
565
583gboolean dt_colorprofiles_bgra8_to_adobergb_rgba8(const uint8_t *const in, uint8_t *const out,
584 const int width, const int height,
586
607gboolean dt_colorprofiles_srgb_to_display_strided(uint8_t *const pixels, const int width, const int height,
608 const int rowstride, const int n_channels,
609 const gboolean has_alpha);
610
611
612/* --- display and soft-proofing settings: whole struct in, whole struct out --- */
613
647
655
674 const char *const filename);
675
685
696 const char *const filename);
697
704
712
725
726
739cmsHPROFILE dt_colorspaces_get_rgb_profile_from_mem(uint8_t *data, uint32_t size);
740
749void dt_colorspaces_cleanup_profile(cmsHPROFILE p);
750
767int dt_colorspaces_get_matrix_from_input_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg,
768 float *lutb, const int lutsize);
769
782int dt_colorspaces_get_matrix_from_output_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg,
783 float *lutb, const int lutsize);
784
795void dt_colorspaces_get_profile_name(cmsHPROFILE p, const char *language, const char *country, char *name,
796 size_t len);
797
809const char *dt_colorspaces_get_name(dt_colorspaces_color_profile_type_t type, const char *filename);
810
816void rgb2hsl(const dt_aligned_pixel_t rgb, float *h, float *s, float *l);
817
823void hsl2rgb(dt_aligned_pixel_t rgb, float h, float s, float l);
824
848
857
860
872
892 GtkWidget *widget);
893
917
926gboolean dt_colorspaces_is_profile_equal(const char *fullname, const char *filename);
927
928
940
953int 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]);
954
971/* RGB_to_CAM, CAM_to_RGB and mul are OPTIONAL -- the implementation guards each with a NULL
972 * check, and both in-tree callers pass NULL for the first two. They are therefore declared as
973 * pointers, NOT as double[4][3] / double[3][4] / double[4]. A declared array bound on a
974 * parameter is an access contract to GCC (-Wstringop-overflow reads it as "must point to at
975 * least this many elements"), so the array spelling asserts a minimum size that NULL cannot
976 * satisfy, and every call warned. Do not restore the array bounds. */
977/* adobe_XYZ_to_CAM is 12 consecutive floats, row-major, 4 rows of 3 -- pass &m[0][0].
978 *
979 * It is a FLAT pointer rather than float[4][3] on purpose. As a 2D array parameter it decays
980 * to pointer-to-row, and GCC then sizes the accessible region as a single row and reports
981 * every call as an overflow: "accessing 48 bytes in a region of size 12". The 48 is right and
982 * the 12 is not -- a _Static_assert on sizeof(((dt_image_t *)0)->adobe_XYZ_to_CAM) == 48
983 * compiles clean. Four other spellings were tried and none silenced it: pointer-to-row, the
984 * C99 [static 4][3] bound, a #pragma GCC diagnostic at the call site (the warning comes from
985 * the middle end, which ignores it), and __attribute__((noclone)).
986 *
987 * RGB_to_CAM, CAM_to_RGB and mul are OPTIONAL -- each is NULL-checked, and both in-tree
988 * callers pass NULL for the first two. They are pointers for the same reason: a declared
989 * array bound is an access contract GCC reads as "must point to at least this many
990 * elements", which NULL cannot satisfy. Do not restore array bounds to any of these. */
991int dt_colorspaces_conversion_matrices_rgb(const float *adobe_XYZ_to_CAM, double (*RGB_to_CAM)[3], double (*CAM_to_RGB)[4], const float *embedded_matrix, double *mul);
992
1005// FIXME: CRITICAL: why is this function NOT used anywhere ???
1006void 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);
1007
1015void dt_colorspaces_cygm_to_rgb(float *out, int num, double CAM_to_RGB[3][4]);
1016
1026void dt_colorspaces_rgb_to_cygm(float *out, int num, double RGB_to_CAM[4][3]);
1027
1028
1029
1030
1031
1032
1033
1034#ifdef __cplusplus
1035}
1036#endif
1037
1038#endif // DT_COLORPROFILES_COLORSPACES_H
1039
1040// clang-format off
1041// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
1042// vim: shiftwidth=2 expandtab tabstop=2 cindent
1043// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
1044// clang-format on
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
static void transform(float *x, float *o, const float *m, const float t_h, const float t_v)
Definition clipping.c:487
const float const int lutsize
void dt_colorspaces_unlock_profile(const dt_colorspaces_color_profile_t *const profile)
cmsHPROFILE dt_colorspaces_create_xyzimatrix_profile(float cam_xyz[3][3])
Create a linear-gamma RGB profile from an XYZ->camera matrix.
void dt_colorspaces_free_image_profile(struct dt_colorspaces_color_profile_t *profile)
Release a profile container owned by an image, closing the LCMS2 handle inside it if and only if the ...
gboolean dt_colorprofiles_bgra8_to_adobergb_rgba8(const uint8_t *const in, uint8_t *const out, const int width, const int height, const dt_colorspaces_color_profile_type_t src_space)
The storage leg: convert an 8-bit plane from src_space (BGRA8) to AdobeRGB (RGBA8),...
void dt_colorspaces_rgb_to_cygm(float *out, int num, double RGB_to_CAM[4][3])
Convert an RGB buffer to 4-channel CYGM, in place.
gboolean dt_colorprofiles_set_display_profile_choice(const dt_colorspaces_color_profile_type_t type, const char *const filename)
Set the monitor profile identity and rebuild the four prepared transforms.
void rgb2hsl(const dt_aligned_pixel_t rgb, float *h, float *s, float *l)
Convert RGB to HSL. Common helper used by iop modules.
gboolean dt_colorprofiles_set_display_intent(const dt_iop_color_intent_t intent)
Set the rendering intent used towards the monitor, rebuilding the four prepared transforms.
void dt_colorspaces_transform_rgba_float_image(const cmsHTRANSFORM transform, const float *image_in, float *image_out, const int width, const int height)
Run a caller-owned LCMS transform over a whole RGBA float image, one OpenMP task per row.
void dt_colorprofiles_cleanup(void)
Persist the display/soft-proof settings to conf, flush the derived matrix/LUT memo,...
struct dt_colorspaces_color_profile_t * dt_colorspaces_new_image_profile(dt_colorspaces_color_profile_type_t type, cmsHPROFILE profile, gboolean owns_profile)
Build a container for a profile that belongs to ONE image rather than to the application.
void dt_colorprofiles_init(void)
Build the module's single instance: register every built-in profile, load the color/in and color/out ...
const dt_colorspaces_color_profile_t * dt_colorspaces_get_profile(dt_colorspaces_color_profile_type_t type, const char *filename, dt_colorspaces_profile_role_t role)
Resolve a profile identity to its registered entry.
int dt_colorspaces_get_matrix_from_output_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg, float *lutb, const int lutsize)
Extract the XYZ->profile matrix and the inverse tone curves from an OUTPUT profile.
void dt_colorspaces_update_display_transforms()
Delete and rebuild the four prepared display transforms from the current display profile and intent.
cmsHPROFILE dt_colorspaces_create_vendor_profile(const char *makermodel)
Create an ICC virtual profile from the shipped vendor matrices.
size_t dt_colorspaces_enumerate_profiles(const dt_colorspaces_profile_role_t role, dt_colorprofile_desc_t **out)
Ordered snapshot of every profile registered for one role.
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
Definition colorspaces.h:98
gboolean dt_colorspaces_profile_exists(const dt_colorspaces_profile_role_t role, const dt_colorspaces_color_profile_type_t type, const char *const filename)
Is this identity registered for this direction?
int dt_colorspaces_get_matrix_from_input_profile(cmsHPROFILE prof, dt_colormatrix_t matrix, float *lutr, float *lutg, float *lutb, const int lutsize)
Extract the profile->XYZ matrix and the per-channel tone curves from an INPUT profile.
void dt_colorspaces_set_profile_changed_handler(dt_colorspaces_profile_changed_handler_t handler)
Register the one callback fired when the display profile changes.
int mat3inv(float *const dst, const float *const src)
Thin alias of mat3inv_float(), same contract.
cmsHPROFILE dt_colorspaces_create_darktable_profile(const char *makermodel)
Create an ICC virtual profile from the shipped profiled colour matrices.
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])
Compute the XYZ->camera and camera->XYZ matrices for an image.
int dt_colorspaces_conversion_matrices_rgb(const float *adobe_XYZ_to_CAM, double(*RGB_to_CAM)[3], double(*CAM_to_RGB)[4], const float *embedded_matrix, double *mul)
Compute the sRGB->camera and camera->sRGB matrices, and the default white balance multipliers.
void dt_colorspaces_cleanup_profile(cmsHPROFILE p)
Close a profile created by any of the dt_colorspaces_create_* / dt_colorspaces_get_rgb_profile_from_m...
gboolean dt_colorprofiles_srgb_to_display_strided(uint8_t *const pixels, const int width, const int height, const int rowstride, const int n_channels, const gboolean has_alpha)
Convert a strided, packed-RGB(A) 8-bit buffer (GdkPixbuf shape) from sRGB to the display profile,...
void dt_colorspaces_set_display_profile(const dt_colorspaces_color_profile_type_t profile_type, GtkWidget *widget)
Refresh the cached display profile from the monitor showing widget (X atom, colord,...
cmsHPROFILE dt_colorspaces_get_rgb_profile_from_mem(uint8_t *data, uint32_t size)
Open an lcms2 RGB profile from an in-memory ICC blob.
void(* dt_colorspaces_profile_changed_handler_t)(void)
Callback invoked after the monitor profile actually changed.
int dt_colorspaces_profile_index(const dt_colorspaces_profile_role_t role, const dt_colorspaces_color_profile_type_t type, const char *const filename)
Combo position of (type, filename) within direction.
void dt_colorprofiles_xyz_to_display(const dt_aligned_pixel_t XYZ, dt_aligned_pixel_t RGB)
Convert one D50 XYZ pixel to display RGB.
const char * dt_colorspaces_get_name(dt_colorspaces_color_profile_type_t type, const char *filename)
Printable name for a profile identity, without touching the profile list.
gboolean dt_colorprofiles_set_softproof_profile_choice(const dt_colorspaces_color_profile_type_t type, const char *const filename)
Set the soft-proofing target identity.
void dt_colorspaces_get_profile_name(cmsHPROFILE p, const char *language, const char *country, char *name, size_t len)
Read a profile's description tag into name, handling character encodings.
cmsHPROFILE dt_colorspaces_create_alternate_profile(const char *makermodel)
Create an ICC virtual profile from the shipped alternate matrices.
gboolean dt_colorprofiles_set_mode(const dt_colorspaces_color_mode_t mode)
Set the proofing mode outright.
gboolean dt_colorspaces_profile_at(const dt_colorspaces_profile_role_t role, const int index, dt_colorprofile_desc_t *const out)
Identity of the profile at index within direction.
gboolean dt_colorprofiles_set_softproof_intent(const dt_iop_color_intent_t intent)
Set the rendering intent used towards the soft-proofing target.
void hsl2rgb(dt_aligned_pixel_t rgb, float h, float s, float l)
Convert HSL back to RGB. Common helper used by iop modules.
gboolean dt_colorspaces_is_profile_equal(const char *fullname, const char *filename)
Do these two names refer to the same profile file?
void dt_colorspaces_lock_profile(const dt_colorspaces_color_profile_t *const profile)
dt_colorspaces_color_mode_t dt_colorprofiles_toggle_mode(const dt_colorspaces_color_mode_t mode)
Turn mode on, or back to DT_PROFILE_NORMAL if it is already the current mode, as one locked read-modi...
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)
Apply CYGM white-balance coefficients to an image already converted to RGB by dt_colorspaces_cygm_to_...
int mat3inv_float(float *const dst, const float *const src)
Invert a 3x3 matrix stored row-major as 9 contiguous floats.
void dt_colorspaces_transform_rgba_float_row(const cmsHTRANSFORM transform, const float *in, float *out, const int width)
Run a caller-owned LCMS transform over one row of RGBA float pixels.
void dt_colorspaces_cygm_to_rgb(float *out, int num, double CAM_to_RGB[3][4])
Convert a 4-channel CYGM buffer to RGB, in place.
void dt_colorprofiles_get_settings(dt_colorprofiles_settings_t *const out)
Copy the current settings into caller-provided storage, under one lock.
gboolean dt_colorprofiles_rgba8_to_display_bgra8(const uint8_t *const in, uint8_t *const out, const int width, const int height, const dt_colorspaces_color_profile_type_t src_space)
Convert a whole 8-bit plane from src_space to the display profile: packed RGBA8 in,...
static dt_aligned_pixel_t rgb
static dt_aligned_pixel_t XYZ
const dt_colormatrix_t dt_aligned_pixel_t out
static dt_aligned_pixel_t RGB
const dt_colormatrix_t matrix
_lib_location_type_t type
Definition location.c:1
float DT_ALIGNED_ARRAY dt_colormatrix_t[4][4]
Definition matrices.h:34
uint32_t width
Definition mipmap_cache.c:0
uint32_t height
Definition mipmap_cache.c:1
size_t size
Definition mipmap_cache.c:3
const char * name
Definition pdf.h:90
The colour-profile vocabulary, and nothing else.
dt_iop_color_intent_t
ICC rendering intent, as stored in iop params and in conf.
#define DT_IOP_COLOR_ICC_LEN
Size of every ICC filename buffer that crosses a module boundary.
dt_colorspaces_color_profile_type_t
dt_colorspaces_profile_role_t
Which use a profile is eligible for – the mandatory filter on every lookup and enumeration.
dt_colorspaces_cicp_transfer_characteristics_t
CICP transfer characteristics, as tagged in AVIF/HEIF/JPEG XL containers.
dt_colorspaces_color_mode_t
What the output transform is being asked to show: the picture, or a proof of it.
dt_colorspaces_cicp_color_primaries_t
CICP colour primaries, as tagged in AVIF/HEIF/JPEG XL containers.
dt_colorspaces_cicp_matrix_coefficients_t
CICP matrix coefficients, as tagged in AVIF/HEIF/JPEG XL containers.
DT_ALIGNED_PIXEL float dt_aligned_pixel_t[4]
Definition simd.h:53
unsigned __int64 uint64_t
Definition strptime.c:75
A profile's public identity: what the GUI displays and stores, and nothing else.
dt_colorspaces_color_profile_type_t type
what to store in params / conf
char name[512]
translated, display-ready
char filename[DT_IOP_COLOR_ICC_LEN]
"" unless type == DT_COLORSPACE_FILE
Consistent snapshot of the display and soft-proofing settings.
char softproof_filename[DT_IOP_COLOR_ICC_LEN]
only meaningful for DT_COLORSPACE_FILE
dt_colorspaces_color_profile_type_t softproof_type
proofing target identity
char display_filename[DT_IOP_COLOR_ICC_LEN]
only meaningful for DT_COLORSPACE_FILE
dt_colorspaces_color_profile_type_t display_type
monitor profile identity
dt_iop_color_intent_t display_intent
rendering intent to the monitor
dt_iop_color_intent_t softproof_intent
rendering intent to the proofing target
dt_colorspaces_color_mode_t mode
NORMAL / SOFTPROOF / GAMUTCHECK.
The three ITU-T H.273 code points that describe a colour space without an ICC profile.
dt_colorspaces_cicp_matrix_coefficients_t matrix_coefficients
dt_colorspaces_cicp_transfer_characteristics_t transfer_characteristics
dt_colorspaces_cicp_color_primaries_t color_primaries
One registered profile: its identity, its LCMS handle, and where it sits in each combo box.
cmsHPROFILE profile
the actual profile; NULL for the three category entries
char filename[DT_IOP_COLOR_ICC_LEN]
icc file name (absolute; compare with dt_colorspaces_is_profile_equal())
pthread_rwlock_t lock
Guards profile, and nothing else in this struct.
dt_colorspaces_color_profile_type_t type
filename is only used for type DT_COLORSPACE_FILE
char name[512]
product name, displayed in GUI (translated for built-ins)
dt_colorspaces_profile_role_t roles
Which menus this entry appears in, as a dt_colorspaces_profile_role_t mask.
The module's private state. Declared here for the module's own .c files only.
cmsHTRANSFORM transform_adobe_rgb_to_display
dt_colorspaces_color_profile_type_t softproof_type
gchar * colord_profile_file
cmsHTRANSFORM transform_display_to_adobe_rgb
cmsHTRANSFORM transform_srgb_to_display
cmsHTRANSFORM transform_xyz_to_display
dt_colorspaces_color_mode_t mode
char softproof_filename[512]
uint8_t * xprofile_data
dt_colorspaces_color_profile_type_t display_type
char display_filename[512]
dt_iop_color_intent_t softproof_intent
dt_iop_color_intent_t display_intent