Creation of the ICCProfileCreator

This commit is contained in:
Hombre 2018-06-25 00:43:11 +02:00
parent e2dc8ea2c3
commit fb0c95969b
35 changed files with 1330 additions and 1799 deletions

View File

@ -201,7 +201,7 @@ FILEBROWSER_UNRANK_TOOLTIP;Effacer le rang\nRaccourci: <b>Shift-0</b>
FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourci: <b>+</b>\n\nRaccourcis dans le mode Éditeur Unique: <b>Alt-+</b> FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourci: <b>+</b>\n\nRaccourcis dans le mode Éditeur Unique: <b>Alt-+</b>
FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourci: <b>-</b>\n\nRaccourcis dans le mode Éditeur Unique: <b>Alt--</b> FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourci: <b>-</b>\n\nRaccourcis dans le mode Éditeur Unique: <b>Alt--</b>
FILECHOOSER_FILTER_ANY;Tous les fichiers FILECHOOSER_FILTER_ANY;Tous les fichiers
FILECHOOSER_FILTER_COLPROF;Profils couleur FILECHOOSER_FILTER_COLPROF;Profils couleur (*.icc)
FILECHOOSER_FILTER_CURVE;Fichiers de courbe FILECHOOSER_FILTER_CURVE;Fichiers de courbe
FILECHOOSER_FILTER_LCP;Profils de correction d'objectif FILECHOOSER_FILTER_LCP;Profils de correction d'objectif
FILECHOOSER_FILTER_PP;Fichiers de traitement FILECHOOSER_FILTER_PP;Fichiers de traitement
@ -228,6 +228,7 @@ GENERAL_OK;OK
GENERAL_OPEN;Ouvrir GENERAL_OPEN;Ouvrir
GENERAL_PORTRAIT;Portrait GENERAL_PORTRAIT;Portrait
GENERAL_SAVE;Enregistrer GENERAL_SAVE;Enregistrer
GENERAL_SAVE_AS;Enregistrer sous...
GENERAL_SLIDER;Curseur GENERAL_SLIDER;Curseur
GENERAL_UNCHANGED;(Inchangé) GENERAL_UNCHANGED;(Inchangé)
GENERAL_WARNING;Attention GENERAL_WARNING;Attention
@ -725,6 +726,7 @@ HISTORY_NEWSNAPSHOT;Ajouter
HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: <b>Alt-s</b> HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: <b>Alt-s</b>
HISTORY_SNAPSHOT;Capture HISTORY_SNAPSHOT;Capture
HISTORY_SNAPSHOTS;Captures HISTORY_SNAPSHOTS;Captures
ICCPROFCREATOR_SAVEDIALOG_TITLE;Enregistrer le profil ICC sous...
IPTCPANEL_CATEGORY;Catégorie IPTCPANEL_CATEGORY;Catégorie
IPTCPANEL_CATEGORYHINT;Identifie le sujet de l'image selon l'opinion du fournisseur. IPTCPANEL_CATEGORYHINT;Identifie le sujet de l'image selon l'opinion du fournisseur.
IPTCPANEL_CITY;Ville IPTCPANEL_CITY;Ville
@ -772,6 +774,7 @@ LENSPROFILE_CORRECTION_LCPFILE;Fichier LCP
LENSPROFILE_CORRECTION_MANUAL;Paramètres de correction manuel LENSPROFILE_CORRECTION_MANUAL;Paramètres de correction manuel
LENSPROFILE_LENS_WARNING;Attention: la taille du capteur utilisé pour le profilage de l'objectif est plus grand que celui de l'appareil sélectionné, le résultat peut être faux. LENSPROFILE_LENS_WARNING;Attention: la taille du capteur utilisé pour le profilage de l'objectif est plus grand que celui de l'appareil sélectionné, le résultat peut être faux.
MAIN_BUTTON_FULLSCREEN;Plein écran MAIN_BUTTON_FULLSCREEN;Plein écran
MAIN_BUTTON_ICCPROFCREATOR;Créateur de Profil ICC
MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigue à l'image Suivante relativement à l'image ouverte dans l'Éditeur\nRaccourci: <b>Shift-F4</b>\n\nPour naviguer à l'image Suivante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: <b>F4</b> MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigue à l'image Suivante relativement à l'image ouverte dans l'Éditeur\nRaccourci: <b>Shift-F4</b>\n\nPour naviguer à l'image Suivante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: <b>F4</b>
MAIN_BUTTON_NAVPREV_TOOLTIP;Navigue à l'image Précédente relativement à l'image ouverte dans l'Éditeur\nRaccourci: <b>Shift-F3</b>\n\nPour naviguer à l'image Précédente relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: <b>F3</b> MAIN_BUTTON_NAVPREV_TOOLTIP;Navigue à l'image Précédente relativement à l'image ouverte dans l'Éditeur\nRaccourci: <b>Shift-F3</b>\n\nPour naviguer à l'image Précédente relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourci: <b>F3</b>
MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronise le Navigateur de fichiers avec l'Éditeur pour révéler la vignette de l'image actuellement ouverte, et efface les filtres dans le Navigateur de fichiers\nRaccourci: <b>x</b>\n\nComme ci-dessus, mais sans effacer les filtres dans le Navigateur de fichiers\nRaccourci: <b>y</b>\n(Notez que la vignette ne sera pas visible si elle a été filtrée). MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronise le Navigateur de fichiers avec l'Éditeur pour révéler la vignette de l'image actuellement ouverte, et efface les filtres dans le Navigateur de fichiers\nRaccourci: <b>x</b>\n\nComme ci-dessus, mais sans effacer les filtres dans le Navigateur de fichiers\nRaccourci: <b>y</b>\n(Notez que la vignette ne sera pas visible si elle a été filtrée).
@ -860,7 +863,7 @@ NAVIGATOR_S;S:
NAVIGATOR_V;V: NAVIGATOR_V;V:
NAVIGATOR_XY_FULL;Largeur = %1, Hauteur = %2 NAVIGATOR_XY_FULL;Largeur = %1, Hauteur = %2
NAVIGATOR_XY_NA;x = n/d, y = n/d NAVIGATOR_XY_NA;x = n/d, y = n/d
OPTIONS_BUNDLED_MISSING;Le profile fourni "<b>%1</b>" n'a pas été trouvé!\n\nVotre installation peut être endomagé.\n\nLes valeurs internes par défaut seront utilisées à la place. OPTIONS_BUNDLED_MISSING;Le profil fourni "<b>%1</b>" n'a pas été trouvé!\n\nVotre installation peut être endomagé.\n\nLes valeurs internes par défaut seront utilisées à la place.
OPTIONS_DEFIMG_MISSING;Le profil par défaut pour les <b>images standards</b> n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"<b>%1</b>" sera utilisé à la place. OPTIONS_DEFIMG_MISSING;Le profil par défaut pour les <b>images standards</b> n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"<b>%1</b>" sera utilisé à la place.
OPTIONS_DEFRAW_MISSING;Le profil par défaut pour les <b>images Raw</b> n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"<b>%1</b>" sera utilisé à la place. OPTIONS_DEFRAW_MISSING;Le profil par défaut pour les <b>images Raw</b> n'a pas été trouvé ou n'a pas été réglé.\n\nVérifiez le dossier de vos profils, il peut être manquant ou endommagé\n\n"<b>%1</b>" sera utilisé à la place.
PARTIALPASTE_ADVANCEDGROUP;Réglages Avancés PARTIALPASTE_ADVANCEDGROUP;Réglages Avancés

View File

@ -205,7 +205,7 @@ FILEBROWSER_UNRANK_TOOLTIP;Unrank.\nShortcut: <b>Shift-0</b>
FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n<b>+</b> - Multiple Editor Tabs Mode,\n<b>Alt</b>-<b>+</b> - Single Editor Tab Mode. FILEBROWSER_ZOOMINHINT;Increase thumbnail size.\n\nShortcuts:\n<b>+</b> - Multiple Editor Tabs Mode,\n<b>Alt</b>-<b>+</b> - Single Editor Tab Mode.
FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n<b>-</b> - Multiple Editor Tabs Mode,\n<b>Alt</b>-<b>-</b> - Single Editor Tab Mode. FILEBROWSER_ZOOMOUTHINT;Decrease thumbnail size.\n\nShortcuts:\n<b>-</b> - Multiple Editor Tabs Mode,\n<b>Alt</b>-<b>-</b> - Single Editor Tab Mode.
FILECHOOSER_FILTER_ANY;All files FILECHOOSER_FILTER_ANY;All files
FILECHOOSER_FILTER_COLPROF;Color profiles FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc)
FILECHOOSER_FILTER_CURVE;Curve files FILECHOOSER_FILTER_CURVE;Curve files
FILECHOOSER_FILTER_LCP;Lens correction profiles FILECHOOSER_FILTER_LCP;Lens correction profiles
FILECHOOSER_FILTER_PP;Processing profiles FILECHOOSER_FILTER_PP;Processing profiles
@ -233,6 +233,7 @@ GENERAL_OPEN;Open
GENERAL_PORTRAIT;Portrait GENERAL_PORTRAIT;Portrait
GENERAL_RESET;Reset GENERAL_RESET;Reset
GENERAL_SAVE;Save GENERAL_SAVE;Save
GENERAL_SAVE_AS;Save as...
GENERAL_SLIDER;Slider GENERAL_SLIDER;Slider
GENERAL_UNCHANGED;(Unchanged) GENERAL_UNCHANGED;(Unchanged)
GENERAL_WARNING;Warning GENERAL_WARNING;Warning
@ -752,6 +753,7 @@ HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b> HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b>
HISTORY_SNAPSHOT;Snapshot HISTORY_SNAPSHOT;Snapshot
HISTORY_SNAPSHOTS;Snapshots HISTORY_SNAPSHOTS;Snapshots
ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as...
IPTCPANEL_CATEGORY;Category IPTCPANEL_CATEGORY;Category
IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider. IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider.
IPTCPANEL_CITY;City IPTCPANEL_CITY;City
@ -799,6 +801,7 @@ LENSPROFILE_CORRECTION_LCPFILE;LCP File
LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters LENSPROFILE_CORRECTION_MANUAL;Manual correction parameters
LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong. LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.
MAIN_BUTTON_FULLSCREEN;Fullscreen MAIN_BUTTON_FULLSCREEN;Fullscreen
MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator
MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: <b>Shift-F4</b>\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: <b>F4</b> MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigate to the next image relative to image opened in the Editor.\nShortcut: <b>Shift-F4</b>\n\nTo navigate to the next image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: <b>F4</b>
MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: <b>Shift-F3</b>\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: <b>F3</b> MAIN_BUTTON_NAVPREV_TOOLTIP;Navigate to the previous image relative to image opened in the Editor.\nShortcut: <b>Shift-F3</b>\n\nTo navigate to the previous image relative to the currently selected thumbnail in the File Browser or Filmstrip:\nShortcut: <b>F3</b>
MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: <b>x</b>\n\nAs above, but without clearing active filters:\nShortcut: <b>y</b>\n(Note that the thumbnail of the opened image will not be shown if filtered out). MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronize the File Browser or Filmstrip with the Editor to reveal the thumbnail of the currently opened image, and clear any active filters.\nShortcut: <b>x</b>\n\nAs above, but without clearing active filters:\nShortcut: <b>y</b>\n(Note that the thumbnail of the opened image will not be shown if filtered out).
@ -1602,49 +1605,47 @@ TP_FLATFIELD_BT_VERTICAL;Vertical
TP_FLATFIELD_CLIPCONTROL;Clip control TP_FLATFIELD_CLIPCONTROL;Clip control
TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast. TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Clip control avoids clipped highlights caused by applying the flat field. If there are already clipped highlights before applying the flat field, clip control can lead to color cast.
TP_FLATFIELD_LABEL;Flat-Field TP_FLATFIELD_LABEL;Flat-Field
TP_GAMMA_CURV;Gamma ICCPROFCREATOR_CUSTOM;Custom
TP_GAMMA_CUSTOM;Custom output profile ICCPROFCREATOR_GAMMA;Gamma
TP_GAMMA_PRIM;Primaries: ICCPROFCREATOR_PRIMARIES;Primaries:
TP_GAMMA_OUTPUT_TRC_PRESET;Tone response curve ICCPROFCREATOR_TRC_PRESET;Tone response curve:
TP_GAMMA_PROF;Generate ICC profile: ICCPROFCREATOR_ICCVERSION;Generated profile's version:
TP_GAMMA_PROF_NONE;none ICCPROFCREATOR_PROF_V2;ICC v2
TP_GAMMA_PROF_V2;ICC v2 ICCPROFCREATOR_PROF_V4;ICC v4
TP_GAMMA_PROF_V4;ICC v4 ICCPROFCREATOR_SLOPE;Slope
TP_GAMMA_SLOP;Slope ICCPROFCREATOR_PRIM_ACESP0;AcesP0
TP_GAMMA_PRIM_ACESP0;AcesP0 ICCPROFCREATOR_PRIM_ACESP1;AcesP1
TP_GAMMA_PRIM_ACESP1;AcesP1 ICCPROFCREATOR_PRIM_ADOBE;Adobe
TP_GAMMA_PRIM_ADOBE;Adobe ICCPROFCREATOR_PRIM_PROPH;Prophoto
TP_GAMMA_PRIM_PROPH;Prophoto ICCPROFCREATOR_PRIM_REC2020;Rec2020
TP_GAMMA_PRIM_REC2020;Rec2020 ICCPROFCREATOR_PRIM_SRGB;sRGB
TP_GAMMA_PRIM_SRGB;sRGB ICCPROFCREATOR_PRIM_WIDEG;Widegamut
TP_GAMMA_PRIM_WIDEG;Widegamut ICCPROFCREATOR_PRIM_BEST;BestRGB
TP_GAMMA_PRIM_BEST;BestRGB ICCPROFCREATOR_PRIM_BETA;BetaRGB
TP_GAMMA_PRIM_BETA;BetaRGB ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
TP_GAMMA_PRIM_BRUCE;BruceRGB ICCPROFCREATOR_PRIM_TOOLTIP;You can only set Custom Primaries with ICC v4 profiles
TP_GAMMA_PRIM_FREE;Custom primaries - ICC v4 ICCPROFCREATOR_PRIM_REDX;Red X
ICCPROFCREATOR_PRIM_REDY;Red Y
TP_GAMMA_PRIM_REDX;Red X ICCPROFCREATOR_PRIM_GREX;Green X
TP_GAMMA_PRIM_REDY;Red Y ICCPROFCREATOR_PRIM_GREY;Green Y
TP_GAMMA_PRIM_GREX;Green X ICCPROFCREATOR_PRIM_BLUX;Blue X
TP_GAMMA_PRIM_GREY;Green Y ICCPROFCREATOR_PRIM_BLUY;Blue Y
TP_GAMMA_PRIM_BLUX;Blue X ICCPROFCREATOR_ILL;Illuminant:
TP_GAMMA_PRIM_BLUY;Blue Y ICCPROFCREATOR_ILL_DEF;Default
TP_GAMMA_TEMP;Illuminant (ICC v4) ICCPROFCREATOR_ILL_41;D41
TP_GAMMA_TEMP_DEF;Default ICCPROFCREATOR_ILL_50;D50
TP_GAMMA_TEMP_41;D41 ICCPROFCREATOR_ILL_55;D55
TP_GAMMA_TEMP_50;D50 ICCPROFCREATOR_ILL_60;D60
TP_GAMMA_TEMP_55;D55 ICCPROFCREATOR_ILL_65;D65
TP_GAMMA_TEMP_60;D60 ICCPROFCREATOR_ILL_80;D80
TP_GAMMA_TEMP_65;D65 ICCPROFCREATOR_ILL_INC;StdA 2856K
TP_GAMMA_TEMP_80;D80 ICCPROFCREATOR_ILL_TOOLTIP;You can only set Illuminant with ICC v4 profiles
TP_GAMMA_TEMP_INC;StdA 2856K TP_ICM_WORKTRC;Tone response curve:
TP_GAMMA_TEMP_TOOLTIP;You can only change the Illuminant and Custom Primaries if you generate an ICC v4 profile TP_ICM_WORKTRC_NONE;None
TP_GAMMA_WORKTRC;Tone response curve: TP_ICM_WORKTRC_CUSTOM;Custom
TP_GAMMA_WORKTRC_NONE;None TP_ICM_WORKTRC_TOOLTIP;Only for build in profiles
TP_GAMMA_WORKTRC_CUSTOM;Custom TP_ICM_WORKTRC_GAMMA;Gamma
TP_GAMMA_WORKTRC_TOOLTIP;Only for build in profiles TP_ICM_WORKTRC_SLOPE;Slope
TP_GAMMA_WORKTRC_GAMMA;Gamma
TP_GAMMA_WORKTRC_SLOPE;Slope
TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1. TP_GENERAL_11SCALE_TOOLTIP;The effects of this tool are only visible or only accurate at a preview scale of 1:1.
TP_GRADIENT_CENTER;Center TP_GRADIENT_CENTER;Center
TP_GRADIENT_CENTER_X;Center X TP_GRADIENT_CENTER_X;Center X

View File

@ -1074,34 +1074,34 @@ public:
/** /**
* @brief sRGB gamma * @brief sRGB gamma
* See also calcGamma above with the following values: pwr=2.399 ts=12.92 mode=0.003041 imax=0.055 * See also calcGamma above with the following values: pwr=2.399 ts=12.92310 mode=0.003041 imax=0.055
* @param x red, green or blue channel's value [0 ; 1] * @param x red, green or blue channel's value [0 ; 1]
* @return the gamma modified's value [0 ; 1] * @return the gamma modified's value [0 ; 1]
*/ */
static inline double gamma2 (double x) // g3 1+g4 static inline double gamma2 (double x) // g3 1+g4
{ {
// return x <= 0.003041 ? x * 12.92 : 1.055 * exp(log(x) / 2.39990) - 0.055;//calculate with calcgamma // return x <= 0.003041 ? x * 12.92310 : 1.055 * exp(log(x) / 2.39990) - 0.055;//calculate with calcgamma
//return x <= 0.0031308 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous //return x <= 0.0031308 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous
//very small differences between the 2 //very small differences between the 2
return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous return x <= 0.003040 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//continuous
// return x <= 0.003041 ? x * 12.92 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous // return x <= 0.003041 ? x * 12.92310 : 1.055011 * exp(log(x) / sRGBGammaCurve) - 0.055011;//continuous
} }
/** /**
* @brief Inverse sRGB gamma * @brief Inverse sRGB gamma
* See also calcGamma above with the following values: pwr=2.3999 ts=12.92 mode=0.003041 imax=0.055 * See also calcGamma above with the following values: pwr=2.3999 ts=12.92310 mode=0.003041 imax=0.055
* @param x red, green or blue channel's value [0 ; 1] * @param x red, green or blue channel's value [0 ; 1]
* @return the inverse gamma modified's value [0 ; 1] * @return the inverse gamma modified's value [0 ; 1]
*/ */
static inline double igamma2 (double x) //g2 static inline double igamma2 (double x) //g2
{ {
// return x <= 0.039289 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * 2.39990);//calculate with calcgamma // return x <= 0.039289 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * 2.39990);//calculate with calcgamma
// return x <= 0.04045 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous // return x <= 0.04045 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous
//very small differences between the 4 //very small differences between the 4
return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous return x <= 0.039286 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//continuous
// return x <= 0.039293 ? x / 12.92 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous // return x <= 0.039293 ? x / 12.92310 : exp(log((x + 0.055011) / 1.055011) * sRGBGammaCurve);//continuous
} }

View File

@ -267,19 +267,19 @@ public:
// standard srgb gamma and its inverse // standard srgb gamma and its inverse
static inline double gamma2 (double x) static inline double gamma2 (double x)
{ {
return x <= 0.00304 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055; return x <= 0.00304 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;
} }
static inline double igamma2 (double x) static inline double igamma2 (double x)
{ {
return x <= 0.03928 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve); return x <= 0.03928 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);
} }
static inline float gamma2 (float x) static inline float gamma2 (float x)
{ {
return x <= 0.00304 ? x * 12.92 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055; return x <= 0.00304 ? x * 12.92310 : 1.055 * expf(logf(x) / sRGBGammaCurve) - 0.055;
} }
static inline float igamma2 (float x) static inline float igamma2 (float x)
{ {
return x <= 0.03928 ? x / 12.92 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve); return x <= 0.03928 ? x / 12.92310 : expf(logf((x + 0.055) / 1.055) * sRGBGammaCurve);
} }
// gamma function with adjustable parameters // gamma function with adjustable parameters
static inline double gamma (double x, double gamma, double start, double slope, double mul, double add) static inline double gamma (double x, double gamma, double start, double slope, double mul, double add)

View File

@ -2896,7 +2896,7 @@ void CLASS lossy_dng_load_raw()
} }
order = sorder; order = sorder;
} else { } else {
gamma_curve (1/2.4, 12.92, 1, 255); gamma_curve (1/2.4, 12.92310, 1, 255);
FORC3 memcpy (cur[c], curve, sizeof cur[0]); FORC3 memcpy (cur[c], curve, sizeof cur[0]);
} }
cinfo.err = jpeg_std_error (&jerr); cinfo.err = jpeg_std_error (&jerr);
@ -6608,7 +6608,7 @@ void CLASS apply_tiff()
if (model[0] == 'N') load_flags = 80; if (model[0] == 'N') load_flags = 80;
} else if (raw_width*raw_height*3 == tiff_ifd[raw].bytes) { } else if (raw_width*raw_height*3 == tiff_ifd[raw].bytes) {
load_raw = &CLASS nikon_yuv_load_raw; load_raw = &CLASS nikon_yuv_load_raw;
gamma_curve (1/2.4, 12.92, 1, 4095); gamma_curve (1/2.4, 12.92310, 1, 4095);
memset (cblack, 0, sizeof cblack); memset (cblack, 0, sizeof cblack);
filters = 0; filters = 0;
} else if (raw_width*raw_height*2 == tiff_ifd[raw].bytes) { } else if (raw_width*raw_height*2 == tiff_ifd[raw].bytes) {
@ -8920,7 +8920,7 @@ void CLASS identify()
strcpy (model,"One"); strcpy (model,"One");
parse_redcine(); parse_redcine();
load_raw = &CLASS redcine_load_raw; load_raw = &CLASS redcine_load_raw;
gamma_curve (1/2.4, 12.92, 1, 4095); gamma_curve (1/2.4, 12.92310, 1, 4095);
filters = 0x49494949; filters = 0x49494949;
} else if (!memcmp (head,"DSC-Image",9)) } else if (!memcmp (head,"DSC-Image",9))
parse_rollei(); parse_rollei();

View File

@ -819,12 +819,7 @@ void Crop::update(int todo)
int ch = baseCrop->getHeight(); int ch = baseCrop->getHeight();
Imagefloat* readyImg0 = NULL; Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6; readyImg0 = parent->ipf.workingtrc(baseCrop, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
int mul = -5;
double gga = 2.4, ssl = 12.92;
readyImg0 = parent->ipf.workingtrc(baseCrop, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {
@ -836,11 +831,10 @@ void Crop::update(int todo)
} }
delete readyImg0; delete readyImg0;
//adjust gamma TRC //adjust gamma TRC
Imagefloat* readyImg = NULL; Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope; readyImg = parent->ipf.workingtrc(baseCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
mul = 5;
readyImg = parent->ipf.workingtrc(baseCrop, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {
@ -852,7 +846,6 @@ void Crop::update(int todo)
} }
delete readyImg; delete readyImg;
} }
} }
} }

View File

@ -211,8 +211,6 @@ void RawImageSource::getAutoMatchedToneCurve(const ColorManagementParams &cp, st
neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST); neutral.raw.bayersensor.method = RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::FAST);
neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST); neutral.raw.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST);
neutral.icm.outputProfile = "sRGB"; neutral.icm.outputProfile = "sRGB";
neutral.icm.outputGammaPreset = "Custom";
neutral.icm.customOutputProfile = false;
std::unique_ptr<IImage8> source; std::unique_ptr<IImage8> source;
{ {

View File

@ -201,9 +201,8 @@ cmsHPROFILE createXYZProfile()
const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1};// const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESp0, xyz_ACESp1};//
const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz};// const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESp0_xyz, ACESp1_xyz};//
const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1"};// const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020", "ACESp0", "ACESp1"};//
const char* wpgamma[] = {"Custom", "BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free
//default = gamma inside profile //default = gamma inside profile
//BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92 //BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92310
//linear g=1.0 //linear g=1.0
//std22 g=2.2 std18 g=1.8 //std22 g=2.2 std18 g=1.8
// high g=1.3 s=3.35 for high dynamic images // high g=1.3 s=3.35 for high dynamic images
@ -1030,97 +1029,6 @@ std::vector<Glib::ustring> rtengine::ICCStore::getWorkingProfiles()
return implementation->getWorkingProfiles(); return implementation->getWorkingProfiles();
} }
std::vector<Glib::ustring> rtengine::ICCStore::getGamma()
{
std::vector<Glib::ustring> res;
for (unsigned int i = 0; i < sizeof(wpgamma) / sizeof(wpgamma[0]); i++) {
res.push_back(wpgamma[i]);
}
return res;
}
void rtengine::ICCStore::getGammaArray(const procparams::ColorManagementParams &icm, GammaValues &ga)
{
const double eps = 0.000000001; // not divide by zero
if (icm.customOutputProfile && icm.outputGammaPreset != "Custom") { //if Free gamma selected with other than Free
// gamma : ga[0],ga[1],ga[2],ga[3],ga[4],ga[5] by calcul
if (icm.outputGammaPreset == "BT709_g2.2_s4.5") {
ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin
ga[1] = 0.909995;
ga[2] = 0.090005;
ga[3] = 0.222222;
ga[4] = 0.081071;
} else if (icm.outputGammaPreset == "sRGB_g2.4_s12.92") {
ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom
ga[1] = 0.947858;
ga[2] = 0.052142;
ga[3] = 0.077399;
ga[4] = 0.039293;
} else if (icm.outputGammaPreset == "High_g1.3_s3.35") {
ga[0] = 1.3 ; //for high dynamic images
ga[1] = 0.998279;
ga[2] = 0.001721;
ga[3] = 0.298507;
ga[4] = 0.005746;
} else if (icm.outputGammaPreset == "Low_g2.6_s6.9") {
ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images
ga[1] = 0.891161;
ga[2] = 0.108839;
ga[3] = 0.144928;
ga[4] = 0.076332;
} else if (icm.outputGammaPreset == "standard_g2.2") {
ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
} else if (icm.outputGammaPreset == "standard_g1.8") {
ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
} else if (icm.outputGammaPreset == "Lab_g3.0s9.03296") {
ga[0] = 3.0; //Lab gamma =3 slope=9.03296
ga[1] = 0.8621;
ga[2] = 0.1379;
ga[3] = 0.1107;
ga[4] = 0.08;
} else { /* if (icm.gamma == "linear_g1.0") */
ga[0] = 1.0; //gamma=1 linear : for high dynamic images(cf : D.Coffin...)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
}
ga[5] = 0.0;
ga[6] = 0.0;
} else { //free gamma selected
GammaValues g_a; //gamma parameters
double pwr = 1.0 / icm.workingTRCGamma;
double ts = icm.workingTRCSlope;
double slope = icm.workingTRCSlope == 0 ? eps : icm.workingTRCSlope;
int mode = 0;
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
ga[4] = g_a[3] * ts;
//printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4);
ga[0] = icm.workingTRCGamma;
ga[1] = 1. / (1.0 + g_a[4]);
ga[2] = g_a[4] / (1.0 + g_a[4]);
ga[3] = 1. / slope;
ga[5] = 0.0;
ga[6] = 0.0;
// printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]);
}
}
// WARNING: the caller must lock lcmsMutex // WARNING: the caller must lock lcmsMutex
cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof) cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof)
{ {
@ -1247,7 +1155,7 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool
pcurve[2] = 1; pcurve[2] = 1;
// pcurve[3] = 0x1f00000;// pcurve for gamma BT709 : g=2.22 s=4.5 // pcurve[3] = 0x1f00000;// pcurve for gamma BT709 : g=2.22 s=4.5
// normalize gamma in RT, default(Emil's choice = sRGB) // normalize gamma in RT, default(Emil's choice = sRGB)
pcurve[3] = 0x2390000;//pcurve for gamma sRGB : g:2.4 s=12.92 pcurve[3] = 0x2390000;//pcurve for gamma sRGB : g:2.4 s=12.92310
} else { } else {
// lcms2 up to 2.4 has a bug with linear gamma causing precision loss(banding) // lcms2 up to 2.4 has a bug with linear gamma causing precision loss(banding)
@ -1311,584 +1219,3 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool
delete [] oprof; delete [] oprof;
return p; return p;
} }
cmsHPROFILE rtengine::ICCStore::createGammaProfile(const procparams::ColorManagementParams &icm, GammaValues &ga)
{
float p[6]; //primaries
ga[5] = 0.0;
ga[6] = 0.0;
enum class ColorTemp {
D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50
D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
D60 = 6005 // for ACES AP0 and ACES AP1
};
ColorTemp temp = ColorTemp::D50;
//primaries for 10 working profiles ==> output profiles
if (icm.outputPimariesPreset == "Widegamut") {
p[0] = 0.7350; //Widegamut primaries
p[1] = 0.2650;
p[2] = 0.1150;
p[3] = 0.8260;
p[4] = 0.1570;
p[5] = 0.0180;
} else if (icm.outputPimariesPreset == "Adobe") {
p[0] = 0.6400; //Adobe primaries
p[1] = 0.3300;
p[2] = 0.2100;
p[3] = 0.7100;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "sRGB") {
p[0] = 0.6400; // sRGB primaries
p[1] = 0.3300;
p[2] = 0.3000;
p[3] = 0.6000;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "BruceRGB") {
p[0] = 0.6400; // Bruce primaries
p[1] = 0.3300;
p[2] = 0.2800;
p[3] = 0.6500;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "BetaRGB") {
p[0] = 0.6888; // Beta primaries
p[1] = 0.3112;
p[2] = 0.1986;
p[3] = 0.7551;
p[4] = 0.1265;
p[5] = 0.0352;
} else if (icm.outputPimariesPreset == "BestRGB") {
p[0] = 0.7347; // Best primaries
p[1] = 0.2653;
p[2] = 0.2150;
p[3] = 0.7750;
p[4] = 0.1300;
p[5] = 0.0350;
} else if (icm.outputPimariesPreset == "Rec2020") {
p[0] = 0.7080; // Rec2020 primaries
p[1] = 0.2920;
p[2] = 0.1700;
p[3] = 0.7970;
p[4] = 0.1310;
p[5] = 0.0460;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "ACES-AP0") {
p[0] = 0.7347; // ACES AP0 primaries
p[1] = 0.2653;
p[2] = 0.0000;
p[3] = 1.0;
p[4] = 0.0001;
p[5] = -0.0770;
temp = ColorTemp::D60;
} else if (icm.outputPimariesPreset == "ACES-AP1") {
p[0] = 0.713; // ACES AP1 primaries
p[1] = 0.293;
p[2] = 0.165;
p[3] = 0.830;
p[4] = 0.128;
p[5] = 0.044;
temp = ColorTemp::D60;
} else if (icm.outputPimariesPreset == "ProPhoto") {
p[0] = 0.7347; //ProPhoto and default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
} else if (icm.outputPimariesPreset == "pfree") {
p[0] = icm.redPrimaryX;
p[1] = icm.redPrimaryY;
p[2] = icm.greenPrimaryX;
p[3] = icm.greenPrimaryY;
p[4] = icm.bluePrimaryX;
p[5] = icm.bluePrimaryY;
} else {
p[0] = 0.7347; //default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
}
cmsCIExyY xyD;
cmsCIExyYTRIPLE Primaries = {
{p[0], p[1], 1.0}, // red
{p[2], p[3], 1.0}, // green
{p[4], p[5], 1.0} // blue
};
cmsToneCurve* GammaTRC[3];
// 7 parameters for smoother curves
cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] } ;
/*
if(icm.wprofile == "v4" && icm.wtemp != "DEF") {
if(icm.wtemp == "D41") outPr = outPr + "D41";
else if(icm.wtemp == "D50") outPr = outPr + "D50";
else if(icm.wtemp == "D55") outPr = outPr + "D55";
else if(icm.wtemp == "D60") outPr = outPr + "D60";
else if(icm.wtemp == "D65") outPr = outPr + "D65";
else if(icm.wtemp == "D80") outPr = outPr + "D80";
}
*/
//lcmsMutex->lock(); Mutex acquired by the caller
double tempv4 = 5000.;
if (icm.outputProfileVersion == "v4" && icm.outputIlluminant != "DEF") {
if (icm.outputIlluminant == "D41") {
tempv4 = 4100.;
} else if (icm.outputIlluminant == "D50") {
tempv4 = 5003.;
} else if (icm.outputIlluminant == "D55") {
tempv4 = 5500.;
} else if (icm.outputIlluminant == "D60") {
tempv4 = 6004.;
} else if (icm.outputIlluminant == "D65") {
tempv4 = 6504.;
} else if (icm.outputIlluminant == "D80") {
tempv4 = 8000.;
} else if (icm.outputIlluminant == "stdA") {
tempv4 = 5003.;
}
}
if (icm.outputProfileVersion == "v4" && icm.outputIlluminant != "DEF") {
cmsWhitePointFromTemp(&xyD, tempv4);
} else {
cmsWhitePointFromTemp(&xyD, (double)temp);
}
if (icm.outputIlluminant == "stdA") xyD = {0.447573, 0.407440, 1.0};
// cmsWhitePointFromTemp(&xyD, (double)temp);
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters); //5 = smoother than 4
cmsHPROFILE oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); //oprofdef become Outputprofile
cmsFreeToneCurve(GammaTRC[0]);
//lcmsMutex->unlock();
return oprofdef;
}
// WARNING: the caller must lock lcmsMutex
cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams::ColorManagementParams &icm, GammaValues &ga)
{
bool pro = false;
Glib::ustring outProfile;
cmsHPROFILE outputProfile = nullptr;
Glib::ustring outPr;
Glib::ustring gammaStr;
if (icm.customOutputProfile && icm.workingTRCGamma < 1.35) {
pro = true; //select profil with gammaTRC modified :
} else if (icm.outputGammaPreset == "linear_g1.0" || (icm.outputGammaPreset == "High_g1.3_s3.35")) {
pro = true; //pro=0 RT_sRGB || Prophoto
}
//necessary for V2 profile
if (icm.outputPimariesPreset == "Prophoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto) && !pro) {
outProfile = options.rtSettings.prophoto;
outPr = "Large_";
} else if (icm.outputPimariesPreset == "Adobe" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe)) {
outProfile = options.rtSettings.adobe;
outPr = "Medium_";
} else if (icm.outputPimariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) {
outProfile = options.rtSettings.widegamut;
outPr = "Wide_";
} else if (icm.outputPimariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) {
outProfile = options.rtSettings.beta;
outPr = "Beta_";
} else if (icm.outputPimariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) {
outProfile = options.rtSettings.best;
outPr = "Best_";
} else if (icm.outputPimariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) {
outProfile = options.rtSettings.bruce;
outPr = "Bruce_";
} else if (icm.outputPimariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb) && !pro) {
outProfile = options.rtSettings.srgb;
outPr = "sRGB_";
} else if (icm.outputPimariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb10) && pro) {
outProfile = options.rtSettings.srgb10;
outPr = "sRGB_";
} else if (icm.outputPimariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto10) && pro) {
outProfile = options.rtSettings.prophoto10;
outPr = "Large_";
} else if (icm.outputPimariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) {
outProfile = options.rtSettings.rec2020;
outPr = "Rec2020_";
} else if (icm.outputPimariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) {
outProfile = options.rtSettings.ACESp0;
outPr = "ACES-AP0_";
} else if (icm.outputPimariesPreset == "ACES-AP1" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp1)) {
outProfile = options.rtSettings.ACESp1;
outPr = "ACES-AP1_";
} else if (icm.outputPimariesPreset == "pfree") {
outProfile = options.rtSettings.srgb;
printf("PFREE\n");
outPr = "pfree_";
} else {
// Should not occurs
if (settings->verbose) {
printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", icm.workingProfile.c_str());
}
return nullptr;
}
//begin adaptation rTRC gTRC bTRC
//"outputProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile
if (settings->verbose) {
printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", outProfile.c_str()); //c_str()
}
outputProfile = ICCStore::getInstance()->getProfile(outProfile); //get output profile
if (outputProfile == nullptr) {
if (settings->verbose) {
printf("\"%s\" ICC output profile not found!\n", outProfile.c_str());
}
return nullptr;
}
// 7 parameters for smoother curves
cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] };
//change desc Tag , to "free gamma", or "BT709", etc.
cmsMLU *mlu;
cmsContext ContextID = cmsGetProfileContextID(outputProfile); // create context to modify some TAGs
mlu = cmsMLUalloc(ContextID, 1);
Glib::ustring outPro;
Glib::ustring outTemp;
double gammsave = 2.4;
double slopesave = 12.92;
if (icm.outputGammaPreset == "High_g1.3_s3.35") {
gammaStr = "_High_g=1.3_s=3.35";
gammsave = 1.3;
slopesave = 3.35;
} else if (icm.outputGammaPreset == "Low_g2.6_s6.9") {
gammaStr = "_Low_g=2.6_s=6.9";
gammsave = 2.6;
slopesave = 6.9;
} else if (icm.outputGammaPreset == "sRGB_g2.4_s12.92") {
gammaStr = "_sRGB_g=2.4_s=12.92";
gammsave = 2.4;
slopesave = 12.92;
} else if (icm.outputGammaPreset == "BT709_g2.2_s4.5") {
gammaStr = "_BT709_g=2.2_s=4.5";
gammsave = 2.22;
slopesave = 4.5;
} else if (icm.outputGammaPreset == "linear_g1.0") {
gammaStr = "_Linear_g=1.0";
gammsave = 1.;
slopesave = 0.;
} else if (icm.outputGammaPreset == "standard_g2.2") {
gammaStr = "_g=2.2";
gammsave = 2.2;
slopesave = 0.;
} else if (icm.outputGammaPreset == "standard_g1.8") {
gammaStr = "_g=1.8";
gammsave = 1.8;
slopesave = 0.;
} else if (icm.outputGammaPreset == "Lab_g3.0s9.03296") {
gammaStr = "_LAB_g3.0_s9.03296";
gammsave = 3.0;
slopesave = 9.03296;
}
outTemp = outPr;
if (icm.outputProfileVersion == "v4" && icm.outputIlluminant != "DEF") {
if (icm.outputIlluminant == "D41") {
outPr = outPr + "D41";
} else if (icm.outputIlluminant == "D50") {
outPr = outPr + "D50";
} else if (icm.outputIlluminant == "D55") {
outPr = outPr + "D55";
} else if (icm.outputIlluminant == "D60") {
outPr = outPr + "D60";
} else if (icm.outputIlluminant == "D65") {
outPr = outPr + "D65";
} else if (icm.outputIlluminant == "D80") {
outPr = outPr + "D80";
} else if (icm.outputIlluminant == "stdA") {
outPr = outPr + "stdA";
}
// printf("outpr=%s \n",outPr.c_str());
}
// create description with gamma + slope + primaries
std::wostringstream gammaWs;
std::wstring gammaStrICC;
gammaWs.precision(3);
Glib::ustring gammaGS;//to save gamma and slope in a tag
if (icm.outputGammaPreset == "Custom") {
if (icm.outputProfileVersion == "v4") {
outPro = "RTv4_" + outPr + std::to_string((float)icm.workingTRCGamma) + " " + std::to_string((float)icm.workingTRCSlope) + ".icc";
} else if (icm.outputProfileVersion == "v2" || icm.outputProfileVersion == "none") {
outPro = "RTv2_" + outPr + std::to_string((float)icm.workingTRCGamma) + " " + std::to_string((float)icm.workingTRCSlope) + ".icc";
}
gammaWs.precision(2);
gammaWs << outTemp << " g=" << (float)icm.workingTRCGamma << " s=" << (float)icm.workingTRCSlope;
gammaGS ="g" +std::to_string((double)icm.workingTRCGamma) + "s" + std::to_string((double)icm.workingTRCSlope) + "!";
} else {
if (icm.outputProfileVersion == "v4") {
outPro = "RTv4_" + outPr + gammaStr + ".icc";
} else if (icm.outputProfileVersion == "v2" || icm.outputProfileVersion == "none") {
outPro = "RTv2_" + outPr + gammaStr + ".icc";
}
gammaWs << outTemp << gammaStr;
gammaGS = "g" + std::to_string(gammsave) + "s" + std::to_string(slopesave) + "!";
}
//write in tag 'dmdd' values of current gamma and slope to retrive after in Output profile
wchar_t *wGammaGS = (wchar_t*)g_utf8_to_utf16 (gammaGS.c_str(), -1, NULL, NULL, NULL);
if (!wGammaGS) {
printf("Error: lab2rgbOut / g_utf8_to_utf16 failed!\n");
}
cmsMLU *description = cmsMLUalloc(NULL, 1);
// Language code (3 letters code) : https://www.iso.org/obp/ui/
// Country code (3 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php
if (cmsMLUsetWide(description, "eng", "USA", wGammaGS)) {
cmsWriteTag(outputProfile, cmsSigDeviceModelDescTag, description); //save 'dmdd' in description
} else {
printf("Error: lab2rgbOut / cmsMLUsetWide failed for \"%s\" !\n", gammaGS.c_str());
}
cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str());
cmsMLUfree(description);
// instruction with //ICC are used to generate ICC profile
if (mlu == nullptr) {
printf("Description error\n");
} else {
if (icm.outputProfileVersion == "v4") {
cmsSetProfileVersion(outputProfile, 4.3);
} else {
cmsSetProfileVersion(outputProfile, 2.0);
}
//change
float p[6]; //primaries
ga[6] = 0.0;
enum class ColorTemp {
D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50
D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
D60 = 6005 //for ACESc->D60
};
ColorTemp temp = ColorTemp::D50;
if (icm.outputPimariesPreset == "Widegamut") {
p[0] = 0.7350; //Widegamut primaries
p[1] = 0.2650;
p[2] = 0.1150;
p[3] = 0.8260;
p[4] = 0.1570;
p[5] = 0.0180;
} else if (icm.outputPimariesPreset == "Adobe") {
p[0] = 0.6400; //Adobe primaries
p[1] = 0.3300;
p[2] = 0.2100;
p[3] = 0.7100;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "sRGB") {
p[0] = 0.6400; // sRGB primaries
p[1] = 0.3300;
p[2] = 0.3000;
p[3] = 0.6000;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "BruceRGB") {
p[0] = 0.6400; // Bruce primaries
p[1] = 0.3300;
p[2] = 0.2800;
p[3] = 0.6500;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "BetaRGB") {
p[0] = 0.6888; // Beta primaries
p[1] = 0.3112;
p[2] = 0.1986;
p[3] = 0.7551;
p[4] = 0.1265;
p[5] = 0.0352;
} else if (icm.outputPimariesPreset == "BestRGB") {
p[0] = 0.7347; // Best primaries
p[1] = 0.2653;
p[2] = 0.2150;
p[3] = 0.7750;
p[4] = 0.1300;
p[5] = 0.0350;
} else if (icm.outputPimariesPreset == "Rec2020") {
p[0] = 0.7080; // Rec2020 primaries
p[1] = 0.2920;
p[2] = 0.1700;
p[3] = 0.7970;
p[4] = 0.1310;
p[5] = 0.0460;
temp = ColorTemp::D65;
} else if (icm.outputPimariesPreset == "ACES-AP0") {
p[0] = 0.7347; // ACES P0 primaries
p[1] = 0.2653;
p[2] = 0.0000;
p[3] = 1.0;
p[4] = 0.0001;
p[5] = -0.0770;
temp = ColorTemp::D60;
} else if (icm.outputPimariesPreset == "ACES-AP1") {
p[0] = 0.713; // ACES P1 primaries
p[1] = 0.293;
p[2] = 0.165;
p[3] = 0.830;
p[4] = 0.128;
p[5] = 0.044;
temp = ColorTemp::D60;
} else if (icm.outputPimariesPreset == "ProPhoto") {
p[0] = 0.7347; // ProPhoto and default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
} else if (icm.outputPimariesPreset == "pfree") {
p[0] = icm.redPrimaryX;
p[1] = icm.redPrimaryY;
p[2] = icm.greenPrimaryX;
p[3] = icm.greenPrimaryY;
p[4] = icm.bluePrimaryX;
p[5] = icm.bluePrimaryY;
} else {
p[0] = 0.7347; //default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
}
cmsCIExyY xyD;
cmsCIExyYTRIPLE Primaries = {
{p[0], p[1], 1.0}, // red
{p[2], p[3], 1.0}, // green
{p[4], p[5], 1.0} // blue
};
double tempv4 = 5000.;
if (icm.outputProfileVersion == "v4" && icm.outputIlluminant != "DEF") {
if (icm.outputIlluminant == "D41") {
tempv4 = 4100.;
} else if (icm.outputIlluminant == "D50") {
tempv4 = 5003.;
} else if (icm.outputIlluminant == "D55") {
tempv4 = 5500.;
} else if (icm.outputIlluminant == "D60") {
tempv4 = 6004.;
} else if (icm.outputIlluminant == "D65") {
tempv4 = 6504.;
} else if (icm.outputIlluminant == "D80") {
tempv4 = 8000.;
} else if (icm.outputIlluminant == "stdA") {
tempv4 = 5003.;
}
//printf("tempv4=%f \n", tempv4);
}
if (icm.outputProfileVersion == "v4" && icm.outputIlluminant != "DEF") {
cmsWhitePointFromTemp(&xyD, tempv4);
} else {
cmsWhitePointFromTemp(&xyD, (double)temp);
}
if (icm.outputIlluminant == "stdA") xyD = {0.447573, 0.407440, 1.0};
cmsToneCurve* GammaTRC[3];
// Calculate output profile's rTRC gTRC bTRC
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters);
if (icm.outputProfileVersion == "v4") {
outputProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC);
}
cmsWriteTag(outputProfile, cmsSigRedTRCTag, GammaTRC[0]);
cmsWriteTag(outputProfile, cmsSigGreenTRCTag, GammaTRC[1]);
cmsWriteTag(outputProfile, cmsSigBlueTRCTag, GammaTRC[2]);
cmsWriteTag(outputProfile, cmsSigProfileDescriptionTag, mlu);//desc changed
/* //to read XYZ values
cmsCIEXYZ *redT = static_cast<cmsCIEXYZ*>(cmsReadTag(outputProfile, cmsSigRedMatrixColumnTag));
cmsCIEXYZ *greenT = static_cast<cmsCIEXYZ*>(cmsReadTag(outputProfile, cmsSigGreenMatrixColumnTag));
cmsCIEXYZ *blueT = static_cast<cmsCIEXYZ*>(cmsReadTag(outputProfile, cmsSigBlueMatrixColumnTag));
printf("rx=%f gx=%f bx=%f ry=%f gy=%f by=%f rz=%f gz=%f bz=%f\n", redT->X, greenT->X, blueT->X, redT->Y, greenT->Y, blueT->Y, redT->Z, greenT->Z, blueT->Z);
*/
cmsMLUfree(mlu);
cmsMLU *copyright = cmsMLUalloc(NULL, 1);
cmsMLUsetASCII(copyright, "en", "US", "Copyright RawTherapee 2018, CC0");
cmsWriteTag(outputProfile, cmsSigCopyrightTag, copyright);
cmsMLUfree(copyright);
// cmsWriteTag(outputProfile, cmsSigProfileDescriptionTag, mlu);//desc changed
cmsMLU *MfgDesc;
MfgDesc = cmsMLUalloc(NULL, 1);
cmsMLUsetASCII(MfgDesc, "en", "US", "RawTherapee");
cmsWriteTag(outputProfile, cmsSigDeviceMfgDescTag, MfgDesc);
cmsMLUfree(MfgDesc);
Glib::ustring realoutPro;
realoutPro = options.cacheBaseDir + "/" + outPro;//ICC profile in cache
if (icm.outputProfileVersion == "v2" || icm.outputProfileVersion == "v4") {
cmsSaveProfileToFile(outputProfile, realoutPro.c_str());
}
// if (GammaTRC) {
cmsFreeToneCurve(GammaTRC[0]);
// }
}
return outputProfile;
}

View File

@ -96,13 +96,9 @@ public:
std::uint8_t getProofIntents(const Glib::ustring& name) const; std::uint8_t getProofIntents(const Glib::ustring& name) const;
/*static*/ std::vector<Glib::ustring> getWorkingProfiles(); /*static*/ std::vector<Glib::ustring> getWorkingProfiles();
static std::vector<Glib::ustring> getGamma();
static void getGammaArray(const procparams::ColorManagementParams& icm, GammaValues& ga);
static cmsHPROFILE makeStdGammaProfile(cmsHPROFILE iprof); static cmsHPROFILE makeStdGammaProfile(cmsHPROFILE iprof);
static cmsHPROFILE createFromMatrix(const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring()); static cmsHPROFILE createFromMatrix(const double matrix[3][3], bool gamma = false, const Glib::ustring& name = Glib::ustring());
static cmsHPROFILE createGammaProfile(const procparams::ColorManagementParams& icm, GammaValues& ga);
static cmsHPROFILE createCustomGammaOutputProfile(const procparams::ColorManagementParams& icm, GammaValues& ga);
private: private:
class Implementation; class Implementation;

View File

@ -93,7 +93,7 @@ ImProcCoordinator::ImProcCoordinator()
fw(0), fh(0), tr(0), fw(0), fh(0), tr(0),
fullw(1), fullh(1), fullw(1), fullh(1),
pW(-1), pH(-1), pW(-1), pH(-1),
plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), icmListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr), plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr),
resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false), resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false),
butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false) butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false)
{} {}
@ -495,11 +495,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall)
int ch = oprevi->getHeight(); int ch = oprevi->getHeight();
// put gamma TRC to 1 // put gamma TRC to 1
Imagefloat* readyImg0 = NULL; Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6; readyImg0 = ipf.workingtrc(oprevi, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
int mul = -5;
double gga = 2.4, ssl = 12.92;
readyImg0 = ipf.workingtrc(oprevi, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {
@ -513,9 +509,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall)
delete readyImg0; delete readyImg0;
//adjust TRC //adjust TRC
Imagefloat* readyImg = NULL; Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope; readyImg = ipf.workingtrc(oprevi, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
mul = 5;
readyImg = ipf.workingtrc(oprevi, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {

View File

@ -158,7 +158,6 @@ protected:
AutoCamListener* acListener; AutoCamListener* acListener;
AutoBWListener* abwListener; AutoBWListener* abwListener;
AutoWBListener* awbListener; AutoWBListener* awbListener;
ICMListener* icmListener;
FrameCountListener *frameCountListener; FrameCountListener *frameCountListener;
ImageTypeListener *imageTypeListener; ImageTypeListener *imageTypeListener;
@ -323,11 +322,6 @@ public:
{ {
awbListener = awb; awbListener = awb;
} }
void setICMListener (ICMListener* icml)
{
icmListener = icml;
}
void setAutoColorTonListener (AutoColorTonListener* bwct) void setAutoColorTonListener (AutoColorTonListener* bwct)
{ {
actListener = bwct; actListener = bwct;

View File

@ -346,9 +346,9 @@ public:
void shadowsHighlights(LabImage *lab); void shadowsHighlights(LabImage *lab);
Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true); Image8* lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, bool consider_histogram_settings = true);
Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga = nullptr); Imagefloat* lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm);
// CieImage *ciec; // CieImage *ciec;
Imagefloat* workingtrc(Imagefloat* working, int cw, int ch, int mul, Glib::ustring profile, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6); Imagefloat* workingtrc(Imagefloat* working, int cw, int ch, int mul, Glib::ustring profile, double gampos, double slpos);
bool transCoord(int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); bool transCoord(int W, int H, int x, int y, int w, int h, int& xv, int& yv, int& wv, int& hv, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);
bool transCoord(int W, int H, const std::vector<Coord2D> &src, std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr); bool transCoord(int W, int H, const std::vector<Coord2D> &src, std::vector<Coord2D> &red, std::vector<Coord2D> &green, std::vector<Coord2D> &blue, double ascaleDef = -1, const LensCorrection *pLCPMap = nullptr);

View File

@ -283,7 +283,7 @@ Image8* ImProcFunctions::lab2rgb(LabImage* lab, int cx, int cy, int cw, int ch,
* If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform * If a custom gamma profile can be created, divide by 327.68, convert to xyz and apply the custom gamma transform
* otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve * otherwise divide by 327.68, convert to xyz and apply the sRGB transform, before converting with gamma2curve
*/ */
Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm, GammaValues *ga) Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, int ch, const procparams::ColorManagementParams &icm)
{ {
if (cx < 0) { if (cx < 0) {
@ -306,85 +306,75 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i
cmsHPROFILE oprof = nullptr; cmsHPROFILE oprof = nullptr;
if (ga) { oprof = ICCStore::getInstance()->getProfile(icm.outputProfile);
lcmsMutex->lock(); Glib::ustring outtest = icm.outputProfile;
ICCStore::getInstance()->getGammaArray(icm, *ga); std::string fileis_RTv2 = outtest.substr(0, 4);
oprof = ICCStore::getInstance()->createGammaProfile(icm, *ga); //printf("IsRTv2=%s\n", fileis_RTv2.c_str());
lcmsMutex->unlock(); if(fileis_RTv2 == "RTv2") {//Only fot ICC v2 : read tag from desc to retrieve gamma and slope save before in generate ICC v2
} else { //due to bug in LCMS in CmsToneCurve
oprof = ICCStore::getInstance()->getProfile(icm.outputProfile); //printf("icmout=%s \n",icm.output.c_str());
Glib::ustring outtest = icm.outputProfile; GammaValues g_b; //gamma parameters
std::string fileis_RTv2 = outtest.substr(0, 4); const double eps = 0.000000001; // not divide by zero
//printf("IsRTv2=%s\n", fileis_RTv2.c_str()); double gammatag = 2.4;
if(fileis_RTv2 == "RTv2") {//Only fot ICC v2 : read tag from desc to retrieve gamma and slope save before in generate ICC v2 double slopetag = 12.92310;
//due to bug in LCMS in CmsToneCurve cmsMLU *modelDescMLU = (cmsMLU*) (cmsReadTag(oprof, cmsSigDeviceModelDescTag));
//printf("icmout=%s \n",icm.output.c_str()); if (modelDescMLU) {
GammaValues g_b; //gamma parameters cmsUInt32Number count = cmsMLUgetWide(modelDescMLU, "eng", "USA", nullptr, 0); // get buffer length first
GammaValues gb; //gamma parameters if (count) {
const double eps = 0.000000001; // not divide by zero wchar_t *buffer = new wchar_t[count];
double gammatag = 2.4; count = cmsMLUgetWide(modelDescMLU, "eng", "USA", buffer, count); // now put the string in the buffer
double slopetag = 12.92; Glib::ustring modelDesc;
cmsMLU *modelDescMLU = (cmsMLU*) (cmsReadTag(oprof, cmsSigDeviceModelDescTag));
if (modelDescMLU) {
cmsUInt32Number count = cmsMLUgetWide(modelDescMLU, "eng", "USA", nullptr, 0); // get buffer length first
if (count) {
wchar_t *buffer = new wchar_t[count];
count = cmsMLUgetWide(modelDescMLU, "eng", "USA", buffer, count); // now put the string in the buffer
Glib::ustring modelDesc;
#if __SIZEOF_WCHAR_T__ == 2 #if __SIZEOF_WCHAR_T__ == 2
char* cModelDesc = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, nullptr, nullptr); // convert to utf-8 in a buffer allocated by glib char* cModelDesc = g_utf16_to_utf8((unsigned short int*)buffer, -1, nullptr, nullptr, nullptr); // convert to utf-8 in a buffer allocated by glib
if (cModelDesc) { if (cModelDesc) {
modelDesc.assign(cModelDesc); modelDesc.assign(cModelDesc);
g_free(cModelDesc); g_free(cModelDesc);
} }
#else #else
modelDesc = utf32_to_utf8(buffer, count); modelDesc = utf32_to_utf8(buffer, count);
#endif #endif
delete [] buffer; delete [] buffer;
if (!modelDesc.empty()) { if (!modelDesc.empty()) {
printf("dmdd=%s\n", modelDesc.c_str()); printf("dmdd=%s\n", modelDesc.c_str());
std::size_t pos = modelDesc.find("g"); std::size_t pos = modelDesc.find("g");
std::size_t posmid = modelDesc.find("s"); std::size_t posmid = modelDesc.find("s");
std::size_t posend = modelDesc.find("!"); std::size_t posend = modelDesc.find("!");
std::string strgamma = modelDesc.substr(pos + 1, (posmid - pos)); std::string strgamma = modelDesc.substr(pos + 1, (posmid - pos));
gammatag = std::stod(strgamma.c_str()); gammatag = std::stod(strgamma.c_str());
std::string strslope = modelDesc.substr(posmid + 1, (posend - posmid)); std::string strslope = modelDesc.substr(posmid + 1, (posend - posmid));
slopetag = std::stod(strslope.c_str()); slopetag = std::stod(strslope.c_str());
// printf("gam=%f slo=%f\n", gammatag, slopetag); // printf("gam=%f slo=%f\n", gammatag, slopetag);
}
} else {
printf("Error: lab2rgbOut / String length is null!\n");
} }
} else { } else {
printf("Error: lab2rgbOut / cmsReadTag/cmsSigDeviceModelDescTag failed!\n"); printf("Error: lab2rgbOut / String length is null!\n");
} }
} else {
double pwr = 1.0 / gammatag; printf("Error: lab2rgbOut / cmsReadTag/cmsSigDeviceModelDescTag failed!\n");
double ts = slopetag;
double slope = slopetag == 0 ? eps : slopetag;
int mode = 0;
Color::calcGamma(pwr, ts, mode, g_b); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
gb[4] = g_b[3] * ts;
gb[0] = gammatag;
gb[1] = 1. / (1.0 + g_b[4]);
gb[2] = g_b[4] / (1.0 + g_b[4]);
gb[3] = 1. / slope;
gb[5] = 0.0;
gb[6] = 0.0;
cmsToneCurve* GammaTRC[3];
cmsFloat64Number Parameters[7] = { gb[0], gb[1], gb[2], gb[3], gb[4], gb[5], gb[6] } ;
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters); //5 = smoother than 4
cmsWriteTag(oprof, cmsSigRedTRCTag, GammaTRC[0]);
cmsWriteTag(oprof, cmsSigGreenTRCTag, GammaTRC[1]);
cmsWriteTag(oprof, cmsSigBlueTRCTag, GammaTRC[2]);
cmsFreeToneCurve(GammaTRC[0]);
} }
double pwr = 1.0 / gammatag;
double ts = slopetag;
double slope = slopetag == 0 ? eps : slopetag;
int mode = 0;
Color::calcGamma(pwr, ts, mode, g_b); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
cmsFloat64Number gammaParams[7]; //gamma parameters
gammaParams[4] = g_b[3] * ts;
gammaParams[0] = gammatag;
gammaParams[1] = 1. / (1.0 + g_b[4]);
gammaParams[2] = g_b[4] / (1.0 + g_b[4]);
gammaParams[3] = 1. / slope;
gammaParams[5] = 0.0;
gammaParams[6] = 0.0;
cmsToneCurve* GammaTRC[3];
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, gammaParams); //5 = smoother than 4
cmsWriteTag(oprof, cmsSigRedTRCTag, GammaTRC[0]);
cmsWriteTag(oprof, cmsSigGreenTRCTag, GammaTRC[1]);
cmsWriteTag(oprof, cmsSigBlueTRCTag, GammaTRC[2]);
cmsFreeToneCurve(GammaTRC[0]);
} }
if (oprof) { if (oprof) {
@ -439,7 +429,7 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i
} }
Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int mul, Glib::ustring profile, double gampos, double slpos, double &ga0, double &ga1, double &ga2, double &ga3, double &ga4, double &ga5, double &ga6) Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int mul, Glib::ustring profile, double gampos, double slpos)
{ {
TMatrix wprof; TMatrix wprof;
@ -474,7 +464,6 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
int five = mul; int five = mul;
ga6 = 0.0;
pwr = 1.0 / gampos; pwr = 1.0 / gampos;
if (gampos < 1.0) { if (gampos < 1.0) {
@ -592,15 +581,6 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
int mode = 0; int mode = 0;
Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2 Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
ga4 = g_a[3] * ts;
ga0 = gampos;
ga1 = 1. / (1.0 + g_a[4]);
ga2 = g_a[4] / (1.0 + g_a[4]);
ga3 = 1. / slpos;
ga5 = 0.0;
ga6 = 0.0;
// printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0, ga1, ga2, ga3, ga4);
cmsCIExyY xyD; cmsCIExyY xyD;
cmsCIExyYTRIPLE Primaries = { cmsCIExyYTRIPLE Primaries = {
@ -610,17 +590,19 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
}; };
cmsToneCurve* GammaTRC[3]; cmsToneCurve* GammaTRC[3];
cmsFloat64Number Parameters[7]; cmsFloat64Number gammaParams[7];
Parameters[0] = ga0; gammaParams[4] = g_a[3] * ts;
Parameters[1] = ga1; gammaParams[0] = gampos;
Parameters[2] = ga2; gammaParams[1] = 1. / (1.0 + g_a[4]);
Parameters[3] = ga3; gammaParams[2] = g_a[4] / (1.0 + g_a[4]);
Parameters[4] = ga4; gammaParams[3] = 1. / slpos;
Parameters[5] = ga5; gammaParams[5] = 0.0;
Parameters[6] = ga6; gammaParams[6] = 0.0;
// 7 parameters for smoother curves // printf("ga0=%f ga1=%f ga2=%f ga3=%f ga4=%f\n", ga0, ga1, ga2, ga3, ga4);
// 7 parameters for smoother curves
cmsWhitePointFromTemp(&xyD, (double)temp); cmsWhitePointFromTemp(&xyD, (double)temp);
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, Parameters);//5 = more smoother than 4 GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, five, gammaParams);//5 = more smoother than 4
oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC); oprofdef = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC);
cmsFreeToneCurve(GammaTRC[0]); cmsFreeToneCurve(GammaTRC[0]);
} }

View File

@ -1960,20 +1960,7 @@ ColorManagementParams::ColorManagementParams() :
workingTRCSlope(12.92310), workingTRCSlope(12.92310),
outputProfile("RT_sRGB"), outputProfile("RT_sRGB"),
outputIntent(RI_RELATIVE), outputIntent(RI_RELATIVE),
outputBPC(true), outputBPC(true)
customOutputProfile(false),
outputPimariesPreset("sRGB"),
redPrimaryX(0.6400),
redPrimaryY(0.3300),
greenPrimaryX(0.3000),
greenPrimaryY(0.6000),
bluePrimaryX(0.1500),
bluePrimaryY(0.0600),
outputGammaPreset("Custom"),
outputGamma(2.4),
outputSlope(12.92),
outputProfileVersion("none"),
outputIlluminant("DEF")
{ {
} }
@ -1992,20 +1979,7 @@ bool ColorManagementParams::operator ==(const ColorManagementParams& other) cons
&& workingTRCSlope == other.workingTRCSlope && workingTRCSlope == other.workingTRCSlope
&& outputProfile == other.outputProfile && outputProfile == other.outputProfile
&& outputIntent == other.outputIntent && outputIntent == other.outputIntent
&& outputBPC == other.outputBPC && outputBPC == other.outputBPC;
&& customOutputProfile == other.customOutputProfile
&& outputPimariesPreset == other.outputPimariesPreset
&& redPrimaryX == other.redPrimaryX
&& redPrimaryY == other.redPrimaryY
&& greenPrimaryX == other.greenPrimaryX
&& greenPrimaryY == other.greenPrimaryY
&& bluePrimaryX == other.bluePrimaryX
&& bluePrimaryY == other.bluePrimaryY
&& outputGammaPreset == other.outputGammaPreset
&& outputGamma == other.outputGamma
&& outputSlope == other.outputSlope
&& outputProfileVersion == other.outputProfileVersion
&& outputIlluminant == other.outputIlluminant;
} }
bool ColorManagementParams::operator !=(const ColorManagementParams& other) const bool ColorManagementParams::operator !=(const ColorManagementParams& other) const
@ -3197,19 +3171,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
keyFile keyFile
); );
saveToKeyfile(!pedited || pedited->icm.outputBPC, "Color Management", "OutputBPC", icm.outputBPC, keyFile); saveToKeyfile(!pedited || pedited->icm.outputBPC, "Color Management", "OutputBPC", icm.outputBPC, keyFile);
saveToKeyfile(!pedited || pedited->icm.customOutputProfile, "Color Management", "CustomOutputProfile", icm.customOutputProfile, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputPrimariesPreset, "Color Management", "OutputPimariesPreset", icm.outputPimariesPreset, keyFile);
saveToKeyfile(!pedited || pedited->icm.redPrimaryX, "Color Management", "RedPrimaryX", icm.redPrimaryX, keyFile);
saveToKeyfile(!pedited || pedited->icm.redPrimaryY, "Color Management", "RedPrimaryY", icm.redPrimaryY, keyFile);
saveToKeyfile(!pedited || pedited->icm.greenPrimaryX, "Color Management", "GreenPrimaryX", icm.greenPrimaryX, keyFile);
saveToKeyfile(!pedited || pedited->icm.greenPrimaryY, "Color Management", "GreenPrimaryY", icm.greenPrimaryY, keyFile);
saveToKeyfile(!pedited || pedited->icm.bluePrimaryX, "Color Management", "BluePrimaryX", icm.bluePrimaryX, keyFile);
saveToKeyfile(!pedited || pedited->icm.bluePrimaryY, "Color Management", "BluePrimaryY", icm.bluePrimaryY, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputGammaPreset, "Color Management", "OutputGammaPreset", icm.outputGammaPreset, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputGamma, "Color Management", "OutputGamma", icm.outputGamma, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputSlope, "Color Management", "OutputSlope", icm.outputSlope, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputProfileVersion, "Color Management", "OutputProfileVersion", icm.outputProfileVersion, keyFile);
saveToKeyfile(!pedited || pedited->icm.outputIlluminant, "Color Management", "OutputIlluminant", icm.outputIlluminant, keyFile);
// Wavelet // Wavelet
saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile); saveToKeyfile(!pedited || pedited->wavelet.enabled, "Wavelet", "Enabled", wavelet.enabled, keyFile);
@ -4251,20 +4212,6 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited)
} }
} }
assignFromKeyfile(keyFile, "Color Management", "OutputBPC", pedited, icm.outputBPC, pedited->icm.outputBPC); assignFromKeyfile(keyFile, "Color Management", "OutputBPC", pedited, icm.outputBPC, pedited->icm.outputBPC);
assignFromKeyfile(keyFile, "Color Management", ppVersion < 338 ? "Freegamma" : "CustomOutputProfile", pedited, icm.customOutputProfile, pedited->icm.customOutputProfile);
assignFromKeyfile(keyFile, "Color Management", "OutputPimariesPreset", pedited, icm.outputPimariesPreset, pedited->icm.outputPrimariesPreset);
assignFromKeyfile(keyFile, "Color Management", "RedPrimaryX", pedited, icm.redPrimaryX, pedited->icm.redPrimaryX);
assignFromKeyfile(keyFile, "Color Management", "RedPrimaryY", pedited, icm.redPrimaryY, pedited->icm.redPrimaryY);
assignFromKeyfile(keyFile, "Color Management", "GreenPrimaryX", pedited, icm.greenPrimaryX, pedited->icm.greenPrimaryX);
assignFromKeyfile(keyFile, "Color Management", "GreenPrimaryY", pedited, icm.greenPrimaryY, pedited->icm.greenPrimaryY);
assignFromKeyfile(keyFile, "Color Management", "BluePrimaryX", pedited, icm.bluePrimaryX, pedited->icm.bluePrimaryX);
assignFromKeyfile(keyFile, "Color Management", "BluePrimaryY", pedited, icm.bluePrimaryY, pedited->icm.bluePrimaryY);
assignFromKeyfile(keyFile, "Color Management", ppVersion < 338 ? "Gammafree" : "OutputGammaPreset", pedited, icm.outputGammaPreset, pedited->icm.outputGammaPreset);
assignFromKeyfile(keyFile, "Color Management", ppVersion < 338 ? "GammaValue" : "OutputGamma", pedited, icm.outputGamma, pedited->icm.outputGamma);
assignFromKeyfile(keyFile, "Color Management", ppVersion < 338 ? "GammaSlope" : "OutputSlope", pedited, icm.outputSlope, pedited->icm.outputSlope);
assignFromKeyfile(keyFile, "Color Management", "OutputProfileVersion", pedited, icm.outputProfileVersion, pedited->icm.outputProfileVersion);
assignFromKeyfile(keyFile, "Color Management", "OutputIlluminant", pedited, icm.outputIlluminant, pedited->icm.outputIlluminant);
} }
if (keyFile.has_group("Wavelet")) { if (keyFile.has_group("Wavelet")) {

View File

@ -1025,20 +1025,6 @@ struct ColorManagementParams {
RenderingIntent outputIntent; RenderingIntent outputIntent;
bool outputBPC; bool outputBPC;
bool customOutputProfile;
Glib::ustring outputPimariesPreset;
double redPrimaryX;
double redPrimaryY;
double greenPrimaryX;
double greenPrimaryY;
double bluePrimaryX;
double bluePrimaryY;
Glib::ustring outputGammaPreset;
double outputGamma;
double outputSlope;
Glib::ustring outputProfileVersion;
Glib::ustring outputIlluminant;
static const Glib::ustring NoICMString; static const Glib::ustring NoICMString;
ColorManagementParams(); ColorManagementParams();

View File

@ -351,13 +351,6 @@ public :
virtual void WBChanged (double temp, double green) = 0; virtual void WBChanged (double temp, double green) = 0;
}; };
class ICMListener
{
public :
virtual ~ICMListener() = default;
virtual void TRCChanged (double gamm, double slo) = 0;
};
class FrameCountListener class FrameCountListener
{ {
public : public :
@ -479,7 +472,6 @@ public:
virtual void setFrameCountListener (FrameCountListener* l) = 0; virtual void setFrameCountListener (FrameCountListener* l) = 0;
virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoBWListener (AutoBWListener* l) = 0;
virtual void setAutoWBListener (AutoWBListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0;
virtual void setICMListener (ICMListener* l) = 0;
virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0;
virtual void setAutoChromaListener (AutoChromaListener* l) = 0; virtual void setAutoChromaListener (AutoChromaListener* l) = 0;
virtual void setRetinexListener (RetinexListener* l) = 0; virtual void setRetinexListener (RetinexListener* l) = 0;

View File

@ -881,9 +881,7 @@ private:
ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile); ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile);
} }
//gamma TRC working
//gamma TRC working
{
if (params.icm.workingTRC == "Custom") { //exec TRC IN free if (params.icm.workingTRC == "Custom") { //exec TRC IN free
Glib::ustring profile; Glib::ustring profile;
profile = params.icm.workingProfile; profile = params.icm.workingProfile;
@ -893,11 +891,7 @@ private:
int ch = baseImg->getHeight(); int ch = baseImg->getHeight();
// put gamma TRC to 1 // put gamma TRC to 1
Imagefloat* readyImg0 = NULL; Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6; readyImg0 = ipf.workingtrc(baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
int mul = -5;
double gga = 2.4, ssl = 12.92;
readyImg0 = ipf.workingtrc(baseImg, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {
@ -909,11 +903,10 @@ private:
} }
delete readyImg0; delete readyImg0;
//adjust TRC //adjust TRC
Imagefloat* readyImg = NULL; Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope; readyImg = ipf.workingtrc(baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
mul = 5;
readyImg = ipf.workingtrc(baseImg, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
#pragma omp parallel for #pragma omp parallel for
for (int row = 0; row < ch; row++) { for (int row = 0; row < ch; row++) {
@ -925,12 +918,9 @@ private:
} }
delete readyImg; delete readyImg;
} }
} }
}
// RGB processing // RGB processing
curve1 (65536); curve1 (65536);
@ -1260,30 +1250,16 @@ private:
bool useLCMS = false; bool useLCMS = false;
bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili ; bool bwonly = params.blackwhite.enabled && !params.colorToning.enabled && !autili && !butili ;
if (params.icm.customOutputProfile /*!= "Custom" || params.icm.customOutputProfile*/) { ///////////// Custom output gamma has been removed, the user now has to create
///////////// a new output profile with the ICCProfileCreator
GammaValues ga; // if Default gamma mode: we use the profile selected in the "Output profile" combobox;
// if(params.blackwhite.enabled) params.toneCurve.hrenabled=false; // gamma come from the selected profile, otherwise it comes from "Free gamma" tool
readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm, &ga);
customGamma = true;
//or selected Free gamma readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm);
useLCMS = false;
if ((jprof = ICCStore::getInstance()->createCustomGammaOutputProfile (params.icm, ga)) == nullptr) { if (settings->verbose) {
printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str());
useLCMS = true;
}
} else {
// if Default gamma mode: we use the profile selected in the "Output profile" combobox;
// gamma come from the selected profile, otherwise it comes from "Free gamma" tool
readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm);
if (settings->verbose) {
printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str());
}
} }
delete labView; delete labView;

View File

@ -71,6 +71,7 @@ set(NONCLISOURCEFILES
histogrampanel.cc histogrampanel.cc
history.cc history.cc
hsvequalizer.cc hsvequalizer.cc
iccprofilecreator.cc
icmpanel.cc icmpanel.cc
ilabel.cc ilabel.cc
imagearea.cc imagearea.cc

View File

@ -50,8 +50,6 @@ enum {
ADDSET_SHARPENMICRO_UNIFORMITY, ADDSET_SHARPENMICRO_UNIFORMITY,
ADDSET_VIBRANCE_PASTELS, ADDSET_VIBRANCE_PASTELS,
ADDSET_VIBRANCE_SATURATED, ADDSET_VIBRANCE_SATURATED,
ADDSET_FREE_OUPUT_GAMMA,
ADDSET_FREE_OUTPUT_SLOPE,
ADDSET_CAT_DEGREE, ADDSET_CAT_DEGREE,
ADDSET_CAT_ADAPTSCENE, ADDSET_CAT_ADAPTSCENE,
ADDSET_CAT_ADAPTVIEWING, ADDSET_CAT_ADAPTVIEWING,

View File

@ -150,7 +150,6 @@ void BatchToolPanelCoordinator::initSession ()
prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false); prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false);
sharpenEdge->setAdjusterBehavior (false, false); sharpenEdge->setAdjusterBehavior (false, false);
sharpenMicro->setAdjusterBehavior (false, false, false); sharpenMicro->setAdjusterBehavior (false, false, false);
icm->setAdjusterBehavior (false, false);
epd->setAdjusterBehavior (false, false, false, false, false); epd->setAdjusterBehavior (false, false, false, false, false);
fattal->setAdjusterBehavior (false, false, false); fattal->setAdjusterBehavior (false, false, false);
@ -199,7 +198,6 @@ void BatchToolPanelCoordinator::initSession ()
sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT], options.baBehav[ADDSET_SHARPENEDGE_PASS]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT], options.baBehav[ADDSET_SHARPENEDGE_PASS]);
sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT], options.baBehav[ADDSET_SHARPENMICRO_CONTRAST], options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT], options.baBehav[ADDSET_SHARPENMICRO_CONTRAST], options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]);
icm->setAdjusterBehavior (options.baBehav[ADDSET_FREE_OUPUT_GAMMA], options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]);
// colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRPROTECT], options.baBehav[ADDSET_COLORTONING_BALANCE]); // colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRPROTECT], options.baBehav[ADDSET_COLORTONING_BALANCE]);
colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]); colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]);
filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]); filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]);
@ -278,8 +276,6 @@ void BatchToolPanelCoordinator::initSession ()
if (options.baBehav[ADDSET_CAT_CONTRAST]) { pparams.colorappearance.contrast = 0; } if (options.baBehav[ADDSET_CAT_CONTRAST]) { pparams.colorappearance.contrast = 0; }
if (options.baBehav[ADDSET_CAT_CONTRAST_Q]) { pparams.colorappearance.qcontrast = 0; } if (options.baBehav[ADDSET_CAT_CONTRAST_Q]) { pparams.colorappearance.qcontrast = 0; }
if (options.baBehav[ADDSET_CAT_HUE]) { pparams.colorappearance.colorh = 0; } if (options.baBehav[ADDSET_CAT_HUE]) { pparams.colorappearance.colorh = 0; }
if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) { pparams.icm.workingTRCGamma = 0; }
if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) { pparams.icm.workingTRCSlope = 0; }
//if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0; //if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0;
//if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0; //if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0;
//if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0; //if (options.baBehav[ADDSET_CS_GREENMAGENTA]) pparams.colorShift.b = 0;

View File

@ -1185,7 +1185,6 @@ void FileCatalog::developRequested (std::vector<FileBrowserEntry*> tbe, bool fas
params.icm.outputProfile = options.fastexport_icm_output_profile; params.icm.outputProfile = options.fastexport_icm_output_profile;
params.icm.outputIntent = options.fastexport_icm_outputIntent; params.icm.outputIntent = options.fastexport_icm_outputIntent;
params.icm.outputBPC = options.fastexport_icm_outputBPC; params.icm.outputBPC = options.fastexport_icm_outputBPC;
params.icm.outputGammaPreset = options.fastexport_icm_custom_output_profile;
} }
if (params.resize.enabled) { if (params.resize.enabled) {

904
rtgui/iccprofilecreator.cc Normal file
View File

@ -0,0 +1,904 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2018 Jacques DESMIS <jdesmis@gmail.com>
* Copyright (c) 2018 Jean-Christophe FRISCH <natureh.510@gmail.com>
*
* RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RawTherapee is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sigc++/slot.h>
#include "iccprofilecreator.h"
#include "multilangmgr.h"
#include "cachemanager.h"
#include "addsetids.h"
#include "../rtengine/icons.h"
#include "../rtengine/color.h"
#include "rtimage.h"
#ifdef _OPENMP
#include <omp.h>
#endif
extern Options options;
namespace rtengine
{
extern const Settings* settings;
}
const char* sTRCPreset[] = {"BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free
ICCProfileCreator::ICCProfileCreator(RTWindow *rtwindow)
: Gtk::Dialog (M ("MAIN_BUTTON_ICCPROFCREATOR"), *rtwindow, true)
, primariesPreset(options.ICCPC_primariesPreset)
, redPrimaryX(options.ICCPC_redPrimaryX)
, redPrimaryY(options.ICCPC_redPrimaryY)
, greenPrimaryX(options.ICCPC_greenPrimaryX)
, greenPrimaryY(options.ICCPC_greenPrimaryY)
, bluePrimaryX(options.ICCPC_bluePrimaryX)
, bluePrimaryY(options.ICCPC_bluePrimaryY)
, gammaPreset(options.ICCPC_gammaPreset)
, gamma(options.ICCPC_gamma)
, slope(options.ICCPC_slope)
, profileVersion(options.ICCPC_profileVersion)
, illuminant(options.ICCPC_illuminant)
, parent(rtwindow)
{
set_default_size(600, -1);
Gtk::Grid* mainGrid = Gtk::manage(new Gtk::Grid());
//--------------------------------- primaries
Gtk::Label* prilab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_PRIMARIES")));
setExpandAlignProperties(prilab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE);
mainGrid->attach(*prilab, 0, 0, 1, 1);
primaries = Gtk::manage(new MyComboBoxText());
setExpandAlignProperties(primaries, false, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
primaries->append(M("ICCPROFCREATOR_PRIM_ACESP0"));
primaries->append(M("ICCPROFCREATOR_PRIM_ACESP1"));
primaries->append(M("ICCPROFCREATOR_PRIM_ADOBE"));
primaries->append(M("ICCPROFCREATOR_PRIM_PROPH"));
primaries->append(M("ICCPROFCREATOR_PRIM_REC2020"));
primaries->append(M("ICCPROFCREATOR_PRIM_SRGB"));
primaries->append(M("ICCPROFCREATOR_PRIM_WIDEG"));
primaries->append(M("ICCPROFCREATOR_PRIM_BEST"));
primaries->append(M("ICCPROFCREATOR_PRIM_BETA"));
primaries->append(M("ICCPROFCREATOR_PRIM_BRUCE"));
primaries->append(M("ICCPROFCREATOR_CUSTOM"));
primaries->set_tooltip_text(M("ICCPROFCREATOR_PRIM_TOOLTIP"));
mainGrid->attach(*primaries, 1, 0, 1, 1);
primariesGrid = Gtk::manage(new Gtk::Grid());
setExpandAlignProperties(primariesGrid, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
primariesGrid->set_column_spacing(5);
/*
Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png"));
*/
aPrimariesRedX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDX"), 0.6300, 0.7350, 0.0001, 0.6400/*, gamuts0, gamutl0*/));
setExpandAlignProperties(aPrimariesRedX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
aPrimariesRedY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_REDY"), 0.2650, 0.3350, 0.0001, 0.3300/*, gamutl1, gamuts1*/));
setExpandAlignProperties(aPrimariesRedY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
aPrimariesGreenX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREX"), 0.0000, 0.3100, 0.0001, 0.3000/*, gamutl2, gamuts2*/));
setExpandAlignProperties(aPrimariesGreenX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
aPrimariesGreenY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_GREY"), 0.5900, 1.0000, 0.0001, 0.6000/*, gamuts3, gamutl3*/));
setExpandAlignProperties(aPrimariesGreenY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
aPrimariesBlueX = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUX"), 0.0001, 0.1600, 0.0001, 0.1500/*, gamutl4, gamuts4*/));
setExpandAlignProperties(aPrimariesBlueX, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
aPrimariesBlueY = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_PRIM_BLUY"), -0.0700, 0.0700, 0.0001, 0.060/*, gamutl5, gamuts5*/));
setExpandAlignProperties(aPrimariesBlueY, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER);
primariesGrid->attach(*aPrimariesRedX, 0, 0, 1, 1);
primariesGrid->attach(*aPrimariesRedY, 1, 0, 1, 1);
primariesGrid->attach(*aPrimariesGreenX, 0, 1, 1, 1);
primariesGrid->attach(*aPrimariesGreenY, 1, 1, 1, 1);
primariesGrid->attach(*aPrimariesBlueX, 0, 2, 1, 1);
primariesGrid->attach(*aPrimariesBlueY, 1, 2, 1, 1);
mainGrid->attach(*primariesGrid, 1, 1, 1, 1);
//--------------------------------- output gamma
Gtk::Label* galab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_TRC_PRESET")));
setExpandAlignProperties(galab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE);
mainGrid->attach(*galab, 0, 2, 1, 1);
trcPresets = Gtk::manage(new MyComboBoxText());
setExpandAlignProperties(trcPresets, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
std::vector<Glib::ustring> outputTRCPresets;
outputTRCPresets.push_back(M("ICCPROFCREATOR_CUSTOM"));
for (unsigned int i = 0; i < sizeof(sTRCPreset) / sizeof(sTRCPreset[0]); i++) {
outputTRCPresets.push_back(sTRCPreset[i]);
}
for (size_t i = 0; i < outputTRCPresets.size(); i++) {
trcPresets->append(outputTRCPresets[i]);
}
mainGrid->attach(*trcPresets, 1, 2, 1, 1);
//--------------------------------- sliders gampos and slpos
aGamma = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_GAMMA"), 1, 3.5, 0.01, 2.4));
setExpandAlignProperties(aGamma, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
if (aGamma->delay < options.adjusterMaxDelay) {
aGamma->delay = options.adjusterMaxDelay;
}
aGamma->show();
mainGrid->attach(*aGamma, 1, 3, 1, 1); //gamma
aSlope = Gtk::manage(new Adjuster(M("ICCPROFCREATOR_SLOPE"), 0, 15, 0.00001, 12.92310));
setExpandAlignProperties(aSlope, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
if (aSlope->delay < options.adjusterMaxDelay) {
aSlope->delay = options.adjusterMaxDelay;
}
aSlope->show();
mainGrid->attach(*aSlope, 1, 4, 1, 1); //slope
//--------------------------------- temperature
Gtk::Label* illlab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ILL")));
setExpandAlignProperties(illlab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE);
mainGrid->attach(*illlab, 0, 5, 1, 1); //slope
cIlluminant = Gtk::manage(new MyComboBoxText());
setExpandAlignProperties(cIlluminant, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
cIlluminant->append(M("ICCPROFCREATOR_ILL_DEF"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_41"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_50"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_55"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_60"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_65"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_80"));
cIlluminant->append(M("ICCPROFCREATOR_ILL_INC"));
cIlluminant->set_tooltip_text(M("ICCPROFCREATOR_ILL_TOOLTIP"));
mainGrid->attach(*cIlluminant, 1, 5, 1, 1);
//--------------------------------- V2 or V4 profiles
Gtk::Label* proflab = Gtk::manage(new Gtk::Label(M("ICCPROFCREATOR_ICCVERSION")));
setExpandAlignProperties(proflab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE);
mainGrid->attach(*proflab, 0, 6, 1, 1);
iccVersion = Gtk::manage(new MyComboBoxText());
setExpandAlignProperties(iccVersion, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_BASELINE);
iccVersion->append(M("ICCPROFCREATOR_PROF_V4"));
iccVersion->append(M("ICCPROFCREATOR_PROF_V2"));
mainGrid->attach(*iccVersion, 1, 6, 1, 1);
//--------------------------------- Adding the mainGrid
get_content_area()->add(*mainGrid);
//--------------------------------- Setting default values for Adjusters
aGamma->setDefault(options.ICCPC_gamma);
aSlope->setDefault(options.ICCPC_slope);
aPrimariesRedX->setDefault(options.ICCPC_redPrimaryX);
aPrimariesRedY->setDefault(options.ICCPC_redPrimaryY);
aPrimariesGreenX->setDefault(options.ICCPC_greenPrimaryX);
aPrimariesGreenY->setDefault(options.ICCPC_greenPrimaryY);
aPrimariesBlueX->setDefault(options.ICCPC_bluePrimaryX);
aPrimariesBlueY->setDefault(options.ICCPC_bluePrimaryY);
//--------------- Updating widgets with actual values (from options)
if (primariesPreset == "ACES-AP0") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP0"));
} else if (primariesPreset == "ACES-AP1") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ACESP1"));
} else if (primariesPreset == "Adobe") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_ADOBE"));
} else if (primariesPreset == "ProPhoto") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_PROPH"));
} else if (primariesPreset == "Rec2020") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_REC2020"));
} else if (primariesPreset == "sRGB") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_SRGB"));
} else if (primariesPreset == "Widegamut") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_WIDEG"));
} else if (primariesPreset == "BestRGB") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BEST"));
} else if (primariesPreset == "BetaRGB") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BETA"));
} else if (primariesPreset == "BruceRGB") {
primaries->set_active_text(M("ICCPROFCREATOR_PRIM_BRUCE"));
} else if (primariesPreset == "custom") {
primaries->set_active_text(M("ICCPROFCREATOR_CUSTOM"));
}
trcPresets->set_active(0);
if (gammaPreset != "Custom") {
trcPresets->set_active_text(gammaPreset);
}
aGamma->setValue(options.ICCPC_gamma);
aSlope->setValue(options.ICCPC_slope);
aPrimariesRedX->setValue(redPrimaryX);
aPrimariesRedY->setValue(redPrimaryY);
aPrimariesGreenX->setValue(greenPrimaryX);
aPrimariesGreenY->setValue(greenPrimaryY);
aPrimariesBlueX->setValue(bluePrimaryX);
aPrimariesBlueY->setValue(bluePrimaryY);
if (illuminant == "DEF") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_DEF"));
} else if (illuminant == "D41") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_41"));
} else if (illuminant == "D50") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_50"));
} else if (illuminant == "D55") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_55"));
} else if (illuminant == "D60") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_60"));
} else if (illuminant == "D65") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_65"));
} else if (illuminant == "D80") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_80"));
} else if (illuminant == "stdA") {
cIlluminant->set_active_text(M("ICCPROFCREATOR_ILL_INC"));
}
iccVersion->set_active(0);
if (profileVersion == "v2") {
iccVersion->set_active(1);
}
trcPresetsChanged();
illuminantChanged();
primariesChanged();
//--------------- Action area button
Gtk::Button* save = Gtk::manage (new Gtk::Button (M ("GENERAL_SAVE_AS")));
save->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::savePressed) );
get_action_area()->pack_start (*save);
Gtk::Button* close = Gtk::manage (new Gtk::Button (M ("GENERAL_CLOSE")));
close->signal_clicked().connect ( sigc::mem_fun (*this, &ICCProfileCreator::closePressed) );
get_action_area()->pack_start (*close);
//--------------- Show childrens
show_all_children ();
//--------------- Connecting the signals
aPrimariesRedX->setAdjusterListener(this);
aPrimariesRedY->setAdjusterListener(this);
aPrimariesGreenX->setAdjusterListener(this);
aPrimariesGreenY->setAdjusterListener(this);
aPrimariesBlueX->setAdjusterListener(this);
aPrimariesBlueY->setAdjusterListener(this);
aGamma->setAdjusterListener(this);
aSlope->setAdjusterListener(this);
primariesconn = primaries->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::primariesChanged));
trcpresetsconn = trcPresets->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::trcPresetsChanged));
illconn = cIlluminant->signal_changed().connect(sigc::mem_fun(*this, &ICCProfileCreator::illuminantChanged));
}
void ICCProfileCreator::closePressed()
{
storeValues();
hide();
}
void ICCProfileCreator::updateICCVersion()
{
if (cIlluminant->get_active_text() != M("ICCPROFCREATOR_ILL_DEF") || primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) {
iccVersion->set_active_text(M("ICCPROFCREATOR_PROF_V4"));
iccVersion->set_sensitive(false);
} else {
iccVersion->set_sensitive(true);
}
}
void ICCProfileCreator::primariesChanged()
{
if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) {
primariesGrid->set_sensitive(true);
} else {
primariesGrid->set_sensitive(false);
}
updateICCVersion();
}
void ICCProfileCreator::illuminantChanged()
{
updateICCVersion();
}
void ICCProfileCreator::trcPresetsChanged()
{
aGamma->block(true);
aSlope->block(true);
bool sensitive = trcPresets->get_active_row_number() == 0;
aGamma->set_sensitive(sensitive);
aSlope->set_sensitive(sensitive);
aGamma->block(false);
aSlope->block(false);
}
void ICCProfileCreator::storeValues()
{
if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V4")) {
options.ICCPC_profileVersion = profileVersion = "v4";
} else if (iccVersion->get_active_text() == M("ICCPROFCREATOR_PROF_V2")) {
options.ICCPC_profileVersion = profileVersion = "v2";
}
options.ICCPC_gammaPreset = gammaPreset = trcPresets->get_active_text();
if (gammaPreset == M("ICCPROFCREATOR_CUSTOM")) {
options.ICCPC_gammaPreset = gammaPreset = "Custom";
}
if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_DEF")) {
options.ICCPC_illuminant = illuminant = "DEF";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_41")) {
options.ICCPC_illuminant = illuminant = "D41";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_50")) {
options.ICCPC_illuminant = illuminant = "D50";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_55")) {
options.ICCPC_illuminant = illuminant = "D55";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_60")) {
options.ICCPC_illuminant = illuminant = "D60";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_65")) {
options.ICCPC_illuminant = illuminant = "D65";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_80")) {
options.ICCPC_illuminant = illuminant = "D80";
} else if (cIlluminant->get_active_text() == M("ICCPROFCREATOR_ILL_INC")) {
options.ICCPC_illuminant = illuminant = "stdA";
}
if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP0")) {
options.ICCPC_primariesPreset = primariesPreset = "ACES-AP0";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ACESP1")) {
options.ICCPC_primariesPreset = primariesPreset = "ACES-AP1";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_ADOBE")) {
options.ICCPC_primariesPreset = primariesPreset = "Adobe";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_PROPH")) {
options.ICCPC_primariesPreset = primariesPreset = "ProPhoto";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_REC2020")) {
options.ICCPC_primariesPreset = primariesPreset = "Rec2020";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_SRGB")) {
options.ICCPC_primariesPreset = primariesPreset = "sRGB";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_WIDEG")) {
options.ICCPC_primariesPreset = primariesPreset = "Widegamut";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BEST")) {
options.ICCPC_primariesPreset = primariesPreset = "BestRGB";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BETA")) {
options.ICCPC_primariesPreset = primariesPreset = "BetaRGB";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_PRIM_BRUCE")) {
options.ICCPC_primariesPreset = primariesPreset = "BruceRGB";
} else if (primaries->get_active_text() == M("ICCPROFCREATOR_CUSTOM")) {
options.ICCPC_primariesPreset = primariesPreset = "custom";
}
options.ICCPC_gamma = gamma = aGamma->getValue();
options.ICCPC_slope = slope = aSlope->getValue();
options.ICCPC_redPrimaryX = redPrimaryX = aPrimariesRedX->getValue();
options.ICCPC_redPrimaryY = redPrimaryY = aPrimariesRedY->getValue();
options.ICCPC_greenPrimaryX = greenPrimaryX = aPrimariesGreenX->getValue();
options.ICCPC_greenPrimaryY = greenPrimaryY = aPrimariesGreenY->getValue();
options.ICCPC_bluePrimaryX = bluePrimaryX = aPrimariesBlueX->getValue();
options.ICCPC_bluePrimaryY = bluePrimaryY = aPrimariesBlueY->getValue();
}
// Copyright (c) 2018 Jacques DESMIS <jdesmis@gmail.com>
// WARNING: the caller must lock lcmsMutex
void ICCProfileCreator::savePressed()
{
bool pro = false;
cmsHPROFILE newProfile = nullptr;
Glib::ustring sNewProfile;
Glib::ustring sPrimariesPreset;
Glib::ustring sGammaPreset;
storeValues();
// -------------------------------------------- Compute de default file name
if (gammaPreset == "linear_g1.0" || (gammaPreset == "High_g1.3_s3.35")) {
pro = true; //pro=0 RT_sRGB || Prophoto
}
//necessary for V2 profile
if (primariesPreset == "ACES-AP0" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp0)) {
sNewProfile = options.rtSettings.ACESp0;
sPrimariesPreset = "ACES-AP0_";
} else if (primariesPreset == "ACES-AP1" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.ACESp1)) {
sNewProfile = options.rtSettings.ACESp1;
sPrimariesPreset = "ACES-AP1_";
} else if (primariesPreset == "Adobe" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.adobe)) {
sNewProfile = options.rtSettings.adobe;
sPrimariesPreset = "Medium_";
} else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto) && !pro) {
sNewProfile = options.rtSettings.prophoto;
sPrimariesPreset = "Large_";
} else if (primariesPreset == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto10) && pro) {
sNewProfile = options.rtSettings.prophoto10;
sPrimariesPreset = "Large_";
} else if (primariesPreset == "Rec2020" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.rec2020)) {
sNewProfile = options.rtSettings.rec2020;
sPrimariesPreset = "Rec2020_";
} else if (primariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb) && !pro) {
sNewProfile = options.rtSettings.srgb;
sPrimariesPreset = "sRGB_";
} else if (primariesPreset == "sRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.srgb10) && pro) {
sNewProfile = options.rtSettings.srgb10;
sPrimariesPreset = "sRGB_";
} else if (primariesPreset == "Widegamut" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.widegamut)) {
sNewProfile = options.rtSettings.widegamut;
sPrimariesPreset = "Wide_";
} else if (primariesPreset == "BestRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.best)) {
sNewProfile = options.rtSettings.best;
sPrimariesPreset = "Best_";
} else if (primariesPreset == "BetaRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.beta)) {
sNewProfile = options.rtSettings.beta;
sPrimariesPreset = "Beta_";
} else if (primariesPreset == "BruceRGB" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.bruce)) {
sNewProfile = options.rtSettings.bruce;
sPrimariesPreset = "Bruce_";
} else if (primariesPreset == "custom") {
sNewProfile = options.rtSettings.srgb;
sPrimariesPreset = "Custom_";
} else {
// Should not occurs
if (rtengine::settings->verbose) {
printf("\"%s\": unknown working profile! - use LCMS2 substitution\n", primariesPreset.c_str());
}
return;
}
//begin adaptation rTRC gTRC bTRC
//"newProfile" profile has the same characteristics than RGB values, but TRC are adapted... for applying profile
if (rtengine::settings->verbose) {
printf("Output Gamma - profile Primaries as RT profile: \"%s\"\n", sNewProfile.c_str());
}
newProfile = rtengine::ICCStore::getInstance()->getProfile(sNewProfile); //get output profile
if (newProfile == nullptr) {
if (rtengine::settings->verbose) {
printf("\"%s\" ICC output profile not found!\n", sNewProfile.c_str());
}
return;
}
// 7 parameters for smoother curves
cmsFloat64Number Parameters[7] = { ga[0], ga[1], ga[2], ga[3], ga[4], ga[5], ga[6] };
//change desc Tag , to "free gamma", or "BT709", etc.
Glib::ustring fName;
Glib::ustring sPrimariesAndIlluminant;
double presetGamma = 2.4;
double presetSlope = 12.92310;
const double eps = 0.000000001; // not divide by zero
if (gammaPreset == "High_g1.3_s3.35") {
sGammaPreset = "_High_g=1.3_s=3.35";
presetGamma = 1.3;
presetSlope = 3.35;
ga[0] = 1.3 ; //for high dynamic images
ga[1] = 0.998279;
ga[2] = 0.001721;
ga[3] = 0.298507;
ga[4] = 0.005746;
} else if (gammaPreset == "Low_g2.6_s6.9") {
sGammaPreset = "_Low_g=2.6_s=6.9";
presetGamma = 2.6;
presetSlope = 6.9;
ga[0] = 2.6 ; //gamma 2.6 variable : for low contrast images
ga[1] = 0.891161;
ga[2] = 0.108839;
ga[3] = 0.144928;
ga[4] = 0.076332;
} else if (gammaPreset == "sRGB_g2.4_s12.92") {
sGammaPreset = "_sRGB_g=2.4_s=12.92310";
presetGamma = 2.4;
presetSlope = 12.92310;
ga[0] = 2.40; //sRGB 2.4 12.92 - RT default as Lightroom
ga[1] = 0.947858;
ga[2] = 0.052142;
ga[3] = 0.077399;
ga[4] = 0.039293;
} else if (gammaPreset == "BT709_g2.2_s4.5") {
sGammaPreset = "_BT709_g=2.2_s=4.5";
presetGamma = 2.22;
presetSlope = 4.5;
ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin
ga[1] = 0.909995;
ga[2] = 0.090005;
ga[3] = 0.222222;
ga[4] = 0.081071;
} else if (gammaPreset == "linear_g1.0") {
sGammaPreset = "_Linear_g=1.0";
presetGamma = 1.;
presetSlope = 0.;
ga[0] = 1.0; //gamma=1 linear : for high dynamic images (cf D.Coffin...)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
} else if (gammaPreset == "standard_g2.2") {
sGammaPreset = "_g=2.2";
presetGamma = 2.2;
presetSlope = 0.;
ga[0] = 2.2; //gamma=2.2(as gamma of Adobe, Widegamut...)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
} else if (gammaPreset == "standard_g1.8") {
sGammaPreset = "_g=1.8";
presetGamma = 1.8;
presetSlope = 0.;
ga[0] = 1.8; //gamma=1.8(as gamma of Prophoto)
ga[1] = 1.;
ga[2] = 0.;
ga[3] = 1. / eps;
ga[4] = 0.;
} else if (gammaPreset == "Lab_g3.0s9.03296") {
sGammaPreset = "_LAB_g3.0_s9.03296";
presetGamma = 3.0;
presetSlope = 9.03296;
ga[0] = 3.0; //Lab gamma =3 slope=9.03296
ga[1] = 0.8621;
ga[2] = 0.1379;
ga[3] = 0.1107;
ga[4] = 0.08;
} else if (gammaPreset == "Custom") {
rtengine::GammaValues g_a; //gamma parameters
double pwr = 1.0 / gamma;
double ts = slope;
double slope2 = slope == 0 ? eps : slope;
int mode = 0;
rtengine::Color::calcGamma(pwr, ts, mode, g_a); // call to calcGamma with selected gamma and slope : return parameters for LCMS2
ga[4] = g_a[3] * ts;
//printf("g_a.gamma0=%f g_a.gamma1=%f g_a.gamma2=%f g_a.gamma3=%f g_a.gamma4=%f\n", g_a.gamma0,g_a.gamma1,g_a.gamma2,g_a.gamma3,g_a.gamma4);
ga[0] = gamma;
ga[1] = 1. /(1.0 + g_a[4]);
ga[2] = g_a[4] /(1.0 + g_a[4]);
ga[3] = 1. / slope2;
//printf("ga[0]=%f ga[1]=%f ga[2]=%f ga[3]=%f ga[4]=%f\n", ga[0],ga[1],ga[2],ga[3],ga[4]);
sGammaPreset = Glib::ustring::compose("_g%1_s%2",
Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma),
Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope));
presetGamma = gamma;
presetSlope = slope;
}
ga[5] = 0.0;
ga[6] = 0.0;
sPrimariesAndIlluminant = sPrimariesPreset;
if (profileVersion == "v4" && illuminant != "DEF") {
sPrimariesPreset += illuminant;
// printf("outpr=%s \n",outPr.c_str());
}
// create description with gamma + slope + primaries
std::wostringstream gammaWs;
std::wstring gammaStrICC;
Glib::ustring gammaGS;//to save gamma and slope in a tag
if (gammaPreset == "Custom") {
Glib::ustring sGamma(Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma));
Glib::ustring sSlope(Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope));
fName = (profileVersion == "v4" ? "RTv4_" : "RTv2_") + sPrimariesAndIlluminant + sGamma + " " + sSlope + ".icc";
gammaWs << sPrimariesPreset << " g=" << Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), gamma) << " s=" << Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), slope);
gammaGS = "g" + sGamma + "s" + sSlope + "!";
} else {
Glib::ustring sGamma(Glib::ustring::format (std::setw(3), std::fixed, std::setprecision(2), presetGamma));
Glib::ustring sSlope(Glib::ustring::format (std::setw(6), std::fixed, std::setprecision(5), presetSlope));
fName = (profileVersion == "v4" ? "RTv4_" : "RTv2_") + sPrimariesAndIlluminant + sGammaPreset + ".icc";
gammaWs << sPrimariesPreset << sGammaPreset;
gammaGS = "g" + sGamma + "s" + sSlope + "!";
}
// -------------------------------------------- Asking the file name
Gtk::FileChooserDialog dialog(getToplevelWindow(this), M("ICCPROFCREATOR_SAVEDIALOG_TITLE"), Gtk::FILE_CHOOSER_ACTION_SAVE);
bindCurrentFolder(dialog, options.lastICCProfCreatorDir);
dialog.set_current_name(fName);
//dialog.set_current_folder(lastPath);
dialog.add_button(M("GENERAL_CANCEL"), Gtk::RESPONSE_CANCEL);
dialog.add_button(M("GENERAL_SAVE"), Gtk::RESPONSE_OK);
Glib::RefPtr<Gtk::FileFilter> filter_icc = Gtk::FileFilter::create();
filter_icc->set_name(M("FILECHOOSER_FILTER_COLPROF"));
filter_icc->add_pattern("*.icc");
dialog.add_filter(filter_icc);
/*
Glib::RefPtr<Gtk::FileFilter> filter_any = Gtk::FileFilter::create();
filter_any->set_name(M("FILECHOOSER_FILTER_ANY"));
filter_any->add_pattern("*");
dialog.add_filter(filter_any);
*/
dialog.show_all_children();
//dialog.set_do_overwrite_confirmation (true);
Glib::ustring absoluteFName;
do {
int result = dialog.run();
if (result != Gtk::RESPONSE_OK) {
return;
} else {
absoluteFName = dialog.get_filename();
Glib::ustring ext = getExtension(absoluteFName);
if (ext != "icc") {
absoluteFName += ".icc";
}
if (confirmOverwrite(dialog, absoluteFName)) {
//lastPath = Glib::path_get_dirname(absoluteFName);
break;
}
}
} while (1);
// -----------------------------------------------------------------
//write in tag 'dmdd' values of current gamma and slope to retrive after in Output profile
wchar_t *wGammaGS = (wchar_t*)g_utf8_to_utf16 (gammaGS.c_str(), -1, NULL, NULL, NULL);
if (!wGammaGS) {
printf("Error: lab2rgbOut / g_utf8_to_utf16 failed!\n");
}
cmsMLU *description = cmsMLUalloc(NULL, 1);
// Language code (3 letters code) : https://www.iso.org/obp/ui/
// Country code (3 letters code) : http://www.loc.gov/standards/iso639-2/php/code_list.php
if (cmsMLUsetWide(description, "eng", "USA", wGammaGS)) {
cmsWriteTag(newProfile, cmsSigDeviceModelDescTag, description); //save 'dmdd' in description
} else {
printf("Error: lab2rgbOut / cmsMLUsetWide failed for \"%s\" !\n", gammaGS.c_str());
}
cmsMLU *mlu;
cmsContext ContextID = cmsGetProfileContextID(newProfile); // create context to modify some TAGs
mlu = cmsMLUalloc(ContextID, 1);
cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str());
cmsMLUfree(description);
// instruction with //ICC are used to generate ICC profile
if (mlu == nullptr) {
printf("Description error\n");
} else {
if (profileVersion == "v4") {
cmsSetProfileVersion(newProfile, 4.3);
} else {
cmsSetProfileVersion(newProfile, 2.0);
}
//change
float p[6]; //primaries
ga[6] = 0.0;
enum class ColorTemp {
D50 = 5003, // for Widegamut, Prophoto Best, Beta -> D50
D65 = 6504, // for sRGB, AdobeRGB, Bruce Rec2020 -> D65
D60 = 6005 //for ACESc->D60
};
ColorTemp temp = ColorTemp::D50;
if (primariesPreset == "Widegamut") {
p[0] = 0.7350; //Widegamut primaries
p[1] = 0.2650;
p[2] = 0.1150;
p[3] = 0.8260;
p[4] = 0.1570;
p[5] = 0.0180;
} else if (primariesPreset == "Adobe") {
p[0] = 0.6400; //Adobe primaries
p[1] = 0.3300;
p[2] = 0.2100;
p[3] = 0.7100;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (primariesPreset == "sRGB") {
p[0] = 0.6400; // sRGB primaries
p[1] = 0.3300;
p[2] = 0.3000;
p[3] = 0.6000;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (primariesPreset == "BruceRGB") {
p[0] = 0.6400; // Bruce primaries
p[1] = 0.3300;
p[2] = 0.2800;
p[3] = 0.6500;
p[4] = 0.1500;
p[5] = 0.0600;
temp = ColorTemp::D65;
} else if (primariesPreset == "BetaRGB") {
p[0] = 0.6888; // Beta primaries
p[1] = 0.3112;
p[2] = 0.1986;
p[3] = 0.7551;
p[4] = 0.1265;
p[5] = 0.0352;
} else if (primariesPreset == "BestRGB") {
p[0] = 0.7347; // Best primaries
p[1] = 0.2653;
p[2] = 0.2150;
p[3] = 0.7750;
p[4] = 0.1300;
p[5] = 0.0350;
} else if (primariesPreset == "Rec2020") {
p[0] = 0.7080; // Rec2020 primaries
p[1] = 0.2920;
p[2] = 0.1700;
p[3] = 0.7970;
p[4] = 0.1310;
p[5] = 0.0460;
temp = ColorTemp::D65;
} else if (primariesPreset == "ACES-AP0") {
p[0] = 0.7347; // ACES P0 primaries
p[1] = 0.2653;
p[2] = 0.0000;
p[3] = 1.0;
p[4] = 0.0001;
p[5] = -0.0770;
temp = ColorTemp::D60;
} else if (primariesPreset == "ACES-AP1") {
p[0] = 0.713; // ACES P1 primaries
p[1] = 0.293;
p[2] = 0.165;
p[3] = 0.830;
p[4] = 0.128;
p[5] = 0.044;
temp = ColorTemp::D60;
} else if (primariesPreset == "ProPhoto") {
p[0] = 0.7347; // ProPhoto and default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
} else if (primariesPreset == "custom") {
p[0] = redPrimaryX;
p[1] = redPrimaryY;
p[2] = greenPrimaryX;
p[3] = greenPrimaryY;
p[4] = bluePrimaryX;
p[5] = bluePrimaryY;
} else {
p[0] = 0.7347; //default primaries
p[1] = 0.2653;
p[2] = 0.1596;
p[3] = 0.8404;
p[4] = 0.0366;
p[5] = 0.0001;
}
cmsCIExyY xyD;
cmsCIExyYTRIPLE Primaries = {
{p[0], p[1], 1.0}, // red
{p[2], p[3], 1.0}, // green
{p[4], p[5], 1.0} // blue
};
double tempv4 = 5000.;
if (profileVersion == "v4" && illuminant != "DEF") {
if (illuminant == "D41") {
tempv4 = 4100.;
} else if (illuminant == "D50") {
tempv4 = 5003.;
} else if (illuminant == "D55") {
tempv4 = 5500.;
} else if (illuminant == "D60") {
tempv4 = 6004.;
} else if (illuminant == "D65") {
tempv4 = 6504.;
} else if (illuminant == "D80") {
tempv4 = 8000.;
} else if (illuminant == "stdA") {
tempv4 = 5003.;
}
//printf("tempv4=%f \n", tempv4);
}
if (profileVersion == "v4" && illuminant != "DEF") {
cmsWhitePointFromTemp(&xyD, tempv4);
} else {
cmsWhitePointFromTemp(&xyD, (double)temp);
}
if (illuminant == "stdA") xyD = {0.447573, 0.407440, 1.0};
// Calculate output profile's rTRC gTRC bTRC
cmsToneCurve* GammaTRC[3];
GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(nullptr, 5, Parameters);
if (profileVersion == "v4") {
newProfile = cmsCreateRGBProfile(&xyD, &Primaries, GammaTRC);
}
cmsWriteTag(newProfile, cmsSigRedTRCTag, GammaTRC[0]);
cmsWriteTag(newProfile, cmsSigGreenTRCTag, GammaTRC[1]);
cmsWriteTag(newProfile, cmsSigBlueTRCTag, GammaTRC[2]);
cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, mlu);//desc changed
/* //to read XYZ values
cmsCIEXYZ *redT = static_cast<cmsCIEXYZ*>(cmsReadTag(newProfile, cmsSigRedMatrixColumnTag));
cmsCIEXYZ *greenT = static_cast<cmsCIEXYZ*>(cmsReadTag(newProfile, cmsSigGreenMatrixColumnTag));
cmsCIEXYZ *blueT = static_cast<cmsCIEXYZ*>(cmsReadTag(newProfile, cmsSigBlueMatrixColumnTag));
printf("rx=%f gx=%f bx=%f ry=%f gy=%f by=%f rz=%f gz=%f bz=%f\n", redT->X, greenT->X, blueT->X, redT->Y, greenT->Y, blueT->Y, redT->Z, greenT->Z, blueT->Z);
*/
cmsMLUfree(mlu);
cmsMLU *copyright = cmsMLUalloc(NULL, 1);
cmsMLUsetASCII(copyright, "eng", "USA", "Copyright RawTherapee 2018, CC0");
cmsWriteTag(newProfile, cmsSigCopyrightTag, copyright);
cmsMLUfree(copyright);
//cmsWriteTag(newProfile, cmsSigProfileDescriptionTag, mlu);//desc changed
cmsMLU *MfgDesc;
MfgDesc = cmsMLUalloc(NULL, 1);
cmsMLUsetASCII(MfgDesc, "eng", "USA", "RawTherapee");
cmsWriteTag(newProfile, cmsSigDeviceMfgDescTag, MfgDesc);
cmsMLUfree(MfgDesc);
/*
Glib::ustring realoutPro;
realoutPro = options.cacheBaseDir + "/" + fName;//ICC profile in cache
*/
if (profileVersion == "v2" || profileVersion == "v4") {
cmsSaveProfileToFile(newProfile, absoluteFName.c_str());
}
//if (GammaTRC) {
cmsFreeToneCurve(GammaTRC[0]);
//}
}
}

88
rtgui/iccprofilecreator.h Normal file
View File

@ -0,0 +1,88 @@
/*
* This file is part of RawTherapee.
*
* Copyright (c) 2018 Jacques DESMIS <jdesmis@gmail.com>
* Copyright (c) 2018 Jean-Christophe FRISCH <natureh.510@gmail.com>
*
* RawTherapee is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RawTherapee is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <gtkmm.h>
#include "adjuster.h"
#include "options.h"
#include <vector>
#include "rtwindow.h"
class ICCProfileCreator : public Gtk::Dialog, public AdjusterListener
{
private:
double ga[7];
//------------------------ Params -----------------------
Glib::ustring primariesPreset;
double redPrimaryX;
double redPrimaryY;
double greenPrimaryX;
double greenPrimaryY;
double bluePrimaryX;
double bluePrimaryY;
Glib::ustring gammaPreset;
double gamma;
double slope;
Glib::ustring profileVersion;
Glib::ustring illuminant;
//-------------------------------------------------------
RTWindow *parent;
Adjuster* aGamma;
Adjuster* aSlope;
Adjuster* aPrimariesRedX;
Adjuster* aPrimariesRedY;
Adjuster* aPrimariesGreenX;
Adjuster* aPrimariesGreenY;
Adjuster* aPrimariesBlueX;
Adjuster* aPrimariesBlueY;
Gtk::Grid* primariesGrid;
MyComboBoxText* iccVersion;
MyComboBoxText* trcPresets;
sigc::connection trcpresetsconn;
MyComboBoxText* primaries;
sigc::connection primariesconn;
MyComboBoxText* cIlluminant;
sigc::connection illconn;
//Glib::ustring lastPath;
void initWithDefaults ();
void storeDefaults ();
void storeValues();
void updateICCVersion();
void primariesChanged();
void illuminantChanged();
void trcPresetsChanged();
static std::vector<Glib::ustring> getGamma();
void getGammaArray();
void savePressed();
void closePressed();
public:
explicit ICCProfileCreator (RTWindow *rtwindow);
};

View File

@ -47,7 +47,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
EvICMslop = m->newEvent(ALLNORAW, "HISTORY_MSG_ICMSLOP"); EvICMslop = m->newEvent(ALLNORAW, "HISTORY_MSG_ICMSLOP");
EvICMtrcinMethod = m->newEvent(ALLNORAW, "HISTORY_MSG_ICMTRCIN"); EvICMtrcinMethod = m->newEvent(ALLNORAW, "HISTORY_MSG_ICMTRCIN");
isBatchMode = lastToneCurve = lastApplyLookTable = lastApplyBaselineExposureOffset = lastApplyHueSatMap = lastCustomOutputProfile = false; isBatchMode = lastToneCurve = lastApplyLookTable = lastApplyBaselineExposureOffset = lastApplyHueSatMap = false;
ipDialog = Gtk::manage(new MyFileChooserButton(M("TP_ICM_INPUTDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN)); ipDialog = Gtk::manage(new MyFileChooserButton(M("TP_ICM_INPUTDLGLABEL"), Gtk::FILE_CHOOSER_ACTION_OPEN));
ipDialog->set_tooltip_text(M("TP_ICM_INPUTCUSTOM_TOOLTIP")); ipDialog->set_tooltip_text(M("TP_ICM_INPUTCUSTOM_TOOLTIP"));
@ -61,7 +61,6 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
iFrame->set_label_align(0.025, 0.5); iFrame->set_label_align(0.025, 0.5);
iVBox = Gtk::manage(new Gtk::VBox()); iVBox = Gtk::manage(new Gtk::VBox());
iVBox->set_spacing(2);
inone = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTNONE"))); inone = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTNONE")));
inone->set_tooltip_text(M("TP_ICM_INPUTNONE_TOOLTIP")); inone->set_tooltip_text(M("TP_ICM_INPUTNONE_TOOLTIP"));
@ -170,7 +169,6 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
wFrame->set_label_align(0.025, 0.5); wFrame->set_label_align(0.025, 0.5);
Gtk::VBox *wProfVBox = Gtk::manage(new Gtk::VBox()); Gtk::VBox *wProfVBox = Gtk::manage(new Gtk::VBox());
wProfVBox->set_spacing(2);
wProfNames = Gtk::manage(new MyComboBoxText()); wProfNames = Gtk::manage(new MyComboBoxText());
wProfVBox->pack_start(*wProfNames, Gtk::PACK_SHRINK); wProfVBox->pack_start(*wProfNames, Gtk::PACK_SHRINK);
@ -189,21 +187,21 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
wTRCHBox = Gtk::manage(new Gtk::HBox()); wTRCHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* wtrclab = Gtk::manage(new Gtk::Label(M("TP_GAMMA_WORKTRC"))); Gtk::Label* wtrclab = Gtk::manage(new Gtk::Label(M("TP_ICM_WORKTRC")));
wTRCHBox->pack_start(*wtrclab, Gtk::PACK_SHRINK); wTRCHBox->pack_start(*wtrclab, Gtk::PACK_SHRINK);
wTRC = Gtk::manage(new MyComboBoxText()); wTRC = Gtk::manage(new MyComboBoxText());
wTRCHBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET); wTRCHBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET);
wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET); wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET);
wTRC->append(M("TP_GAMMA_WORKTRC_NONE")); wTRC->append(M("TP_ICM_WORKTRC_NONE"));
wTRC->append(M("TP_GAMMA_WORKTRC_CUSTOM")); wTRC->append(M("TP_ICM_WORKTRC_CUSTOM"));
wTRC->set_active(0); wTRC->set_active(0);
wTRC->set_tooltip_text(M("TP_GAMMA_WORKTRC_TOOLTIP")); wTRC->set_tooltip_text(M("TP_ICM_WORKTRC_TOOLTIP"));
wGamma = Gtk::manage(new Adjuster(M("TP_GAMMA_WORKTRC_GAMMA"), 0.40, 15.0, 0.001, 2.4)); wGamma = Gtk::manage(new Adjuster(M("TP_ICM_WORKTRC_GAMMA"), 0.40, 15.0, 0.001, 2.4));
wSlope = Gtk::manage(new Adjuster(M("TP_GAMMA_WORKTRC_SLOPE"), 0., 150., 0.01, 12.92)); wSlope = Gtk::manage(new Adjuster(M("TP_ICM_WORKTRC_SLOPE"), 0., 150., 0.01, 12.92310));
wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK); wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK);
wGamma->show(); wGamma->show();
@ -234,7 +232,6 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
oFrame->set_label_align(0.025, 0.5); oFrame->set_label_align(0.025, 0.5);
Gtk::VBox *oProfVBox = Gtk::manage(new Gtk::VBox()); Gtk::VBox *oProfVBox = Gtk::manage(new Gtk::VBox());
oProfVBox->set_spacing(2);
oProfNames = Gtk::manage(new MyComboBoxText()); oProfNames = Gtk::manage(new MyComboBoxText());
oProfVBox->pack_start(*oProfNames, Gtk::PACK_SHRINK); oProfVBox->pack_start(*oProfNames, Gtk::PACK_SHRINK);
@ -269,171 +266,8 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
obpc->set_active(true); obpc->set_active(true);
oProfVBox->pack_start(*obpc, Gtk::PACK_SHRINK); oProfVBox->pack_start(*obpc, Gtk::PACK_SHRINK);
// Output gamma
oTRCPresetsHBox = Gtk::manage(new Gtk::HBox());
//Gtk::HBox* gaHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* galab = Gtk::manage(new Gtk::Label(M("TP_GAMMA_OUTPUT_TRC_PRESET")));
oTRCPresetsHBox->pack_start(*galab, Gtk::PACK_SHRINK);
oTRCPresets = Gtk::manage(new MyComboBoxText());
oTRCPresetsHBox->pack_start(*oTRCPresets, Gtk::PACK_EXPAND_WIDGET);
std::vector<Glib::ustring> outputTRCPresets = rtengine::ICCStore::getGamma();
for (size_t i = 0; i < outputTRCPresets.size(); i++) {
oTRCPresets->append(outputTRCPresets[i]);
}
oTRCPresets->set_active(0);
Gtk::Frame* cgFrame = Gtk::manage(new Gtk::Frame());
Gtk::VBox *cgVBox = Gtk::manage(new Gtk::VBox());
cgVBox->set_spacing(2);
customOutProfile = Gtk::manage(new Gtk::CheckButton((M("TP_GAMMA_CUSTOM"))));
customOutProfile->set_active(false);
cgFrame->set_label_widget(*customOutProfile);
//primaries
primariesHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* prilab = Gtk::manage(new Gtk::Label(M("TP_GAMMA_PRIM")));
primariesHBox->pack_start(*prilab, Gtk::PACK_SHRINK);
primaries = Gtk::manage(new MyComboBoxText());
primariesHBox->pack_start(*primaries, Gtk::PACK_EXPAND_WIDGET);
cgVBox->pack_start(*primariesHBox, Gtk::PACK_EXPAND_WIDGET);
primaries->append(M("TP_GAMMA_PRIM_ACESP0"));
primaries->append(M("TP_GAMMA_PRIM_ACESP1"));
primaries->append(M("TP_GAMMA_PRIM_ADOBE"));
primaries->append(M("TP_GAMMA_PRIM_PROPH"));
primaries->append(M("TP_GAMMA_PRIM_REC2020"));
primaries->append(M("TP_GAMMA_PRIM_SRGB"));
primaries->append(M("TP_GAMMA_PRIM_WIDEG"));
primaries->append(M("TP_GAMMA_PRIM_BEST"));
primaries->append(M("TP_GAMMA_PRIM_BETA"));
primaries->append(M("TP_GAMMA_PRIM_BRUCE"));
primaries->append(M("TP_GAMMA_PRIM_FREE"));
primaries->set_active(5);
primariesVBox = Gtk::manage(new Gtk::VBox());
priGreenHBox = Gtk::manage(new Gtk::HBox());
priBlueHBox = Gtk::manage(new Gtk::HBox());
priRedHBox = Gtk::manage(new Gtk::HBox());
Gtk::Image* gamuts0 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl0 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts1 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl1 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts2 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl2 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts3 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl3 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts4 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl4 = Gtk::manage(new RTImage("rt-logo-small.png"));
Gtk::Image* gamuts5 = Gtk::manage(new RTImage("rt-logo-tiny.png"));
Gtk::Image* gamutl5 = Gtk::manage(new RTImage("rt-logo-small.png"));
primariesRedX = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_REDX"), 0.6300, 0.7350, 0.0001, 0.6400, gamuts0, gamutl0));
primariesRedY = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_REDY"), 0.2650, 0.3350, 0.0001, 0.3300, gamutl1, gamuts1));
primariesGreenX = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_GREX"), 0.0000, 0.3100, 0.0001, 0.3000, gamutl2, gamuts2));
primariesGreenY = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_GREY"), 0.5900, 1.0000, 0.0001, 0.6000, gamuts3, gamutl3));
primariesBlueX = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_BLUX"), 0.0001, 0.1600, 0.0001, 0.1500, gamutl4, gamuts4));
primariesBlueY = Gtk::manage(new Adjuster(M("TP_GAMMA_PRIM_BLUY"), -0.0700, 0.0700, 0.0001, 0.060, gamutl5, gamuts5));
priRedHBox->pack_start(*primariesRedX,Gtk::PACK_EXPAND_WIDGET, 4);
priRedHBox->pack_start(*primariesRedY,Gtk::PACK_EXPAND_WIDGET, 4);
primariesVBox->pack_start(*priRedHBox,Gtk::PACK_EXPAND_WIDGET, 4);
priGreenHBox->pack_start(*primariesGreenX, Gtk::PACK_EXPAND_WIDGET, 4);
priGreenHBox->pack_start(*primariesGreenY, Gtk::PACK_EXPAND_WIDGET, 4);
primariesVBox->pack_start(*priGreenHBox, Gtk::PACK_EXPAND_WIDGET, 4);
priBlueHBox->pack_start(*primariesBlueX, Gtk::PACK_EXPAND_WIDGET, 4);
priBlueHBox->pack_start(*primariesBlueY, Gtk::PACK_EXPAND_WIDGET, 4);
primariesVBox->pack_start(*priBlueHBox,Gtk::PACK_EXPAND_WIDGET, 4);
cgVBox->pack_start(*primariesVBox, Gtk::PACK_SHRINK);
primariesRedX->setAdjusterListener(this);
primariesRedY->setAdjusterListener(this);
primariesGreenX->setAdjusterListener(this);
primariesGreenY->setAdjusterListener(this);
primariesBlueX->setAdjusterListener(this);
primariesBlueY->setAdjusterListener(this);
//sliders gampos and slpos
cgVBox->pack_start(*oTRCPresetsHBox, Gtk::PACK_EXPAND_WIDGET);
oTRCHBox = Gtk::manage(new Gtk::HBox());
oGamma = Gtk::manage(new Adjuster(M("TP_GAMMA_CURV"), 1, 3.5, 0.00001, 2.4));
oGamma->setAdjusterListener(this);
if (oGamma->delay < options.adjusterMaxDelay) {
oGamma->delay = options.adjusterMaxDelay;
}
oGamma->show();
oSlope = Gtk::manage(new Adjuster(M("TP_GAMMA_SLOP"), 0, 15, 0.00001, 12.92310));
oSlope->setAdjusterListener(this);
if (oSlope->delay < options.adjusterMaxDelay) {
oSlope->delay = options.adjusterMaxDelay;
}
oSlope->show();
oTRCHBox->pack_start(*oGamma, Gtk::PACK_EXPAND_WIDGET, 4); //gamma
oTRCHBox->pack_start(*oSlope, Gtk::PACK_EXPAND_WIDGET, 4); //slope
cgVBox->pack_start(*oTRCHBox, Gtk::PACK_EXPAND_WIDGET, 4);
//V2 or V4 profiles
profHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* proflab = Gtk::manage(new Gtk::Label(M("TP_GAMMA_PROF") + ":"));
profHBox->pack_start(*proflab, Gtk::PACK_SHRINK);
wprofile = Gtk::manage(new MyComboBoxText());
profHBox->pack_start(*wprofile, Gtk::PACK_EXPAND_WIDGET);
// fgVBox->pack_start(*profHBox, Gtk::PACK_EXPAND_WIDGET);
wprofile->append(M("TP_GAMMA_PROF_NONE"));
wprofile->append(M("TP_GAMMA_PROF_V2"));
wprofile->append(M("TP_GAMMA_PROF_V4"));
wprofile->set_active(0);
//temperature
oIllHBox = Gtk::manage(new Gtk::HBox());
Gtk::Label* templab = Gtk::manage(new Gtk::Label(M("TP_GAMMA_TEMP") + ":"));
oIllHBox->pack_start(*templab, Gtk::PACK_SHRINK);
oIlluminant = Gtk::manage(new MyComboBoxText());
oIllHBox->pack_start(*oIlluminant, Gtk::PACK_EXPAND_WIDGET);
cgVBox->pack_start(*oIllHBox, Gtk::PACK_EXPAND_WIDGET);
oIlluminant->append(M("TP_GAMMA_TEMP_DEF"));
oIlluminant->append(M("TP_GAMMA_TEMP_41"));
oIlluminant->append(M("TP_GAMMA_TEMP_50"));
oIlluminant->append(M("TP_GAMMA_TEMP_55"));
oIlluminant->append(M("TP_GAMMA_TEMP_60"));
oIlluminant->append(M("TP_GAMMA_TEMP_65"));
oIlluminant->append(M("TP_GAMMA_TEMP_80"));
oIlluminant->append(M("TP_GAMMA_TEMP_INC"));
oIlluminant->set_active(0);
oIlluminant->set_tooltip_text(M("TP_GAMMA_TEMP_TOOLTIP"));
cgVBox->pack_start(*profHBox, Gtk::PACK_EXPAND_WIDGET);
cgFrame->add(*cgVBox);
oProfVBox->pack_start(*cgFrame, Gtk::PACK_EXPAND_WIDGET);
oFrame->add(*oProfVBox); oFrame->add(*oProfVBox);
pack_start(*oFrame, Gtk::PACK_EXPAND_WIDGET); pack_start(*oFrame, Gtk::PACK_EXPAND_WIDGET);
// ---------------------------- Output gamma list entries // ---------------------------- Output gamma list entries
@ -472,15 +306,10 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
wprofnamesconn = wProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wpChanged)); wprofnamesconn = wProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wpChanged));
oprofnamesconn = oProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::opChanged)); oprofnamesconn = oProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::opChanged));
orendintentconn = oRendIntent->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::oiChanged)); orendintentconn = oRendIntent->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::oiChanged));
otrcconn = oTRCPresets->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::gpChanged));
dcpillconn = dcpIll->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::dcpIlluminantChanged)); dcpillconn = dcpIll->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::dcpIlluminantChanged));
primariesconn = primaries->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wprimariesChanged));
wprofileconn = wprofile->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wprofileChanged));
oillconn = oIlluminant->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wtempChanged));
wtrcconn = wTRC->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wtrcinChanged)); wtrcconn = wTRC->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::wtrcinChanged));
obpcconn = obpc->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::oBPCChanged)); obpcconn = obpc->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::oBPCChanged));
coprofconn = customOutProfile->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::GamChanged));
tcurveconn = ckbToneCurve->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::toneCurveChanged)); tcurveconn = ckbToneCurve->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::toneCurveChanged));
ltableconn = ckbApplyLookTable->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyLookTableChanged)); ltableconn = ckbApplyLookTable->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyLookTableChanged));
beoconn = ckbApplyBaselineExposureOffset->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyBaselineExposureOffsetChanged)); beoconn = ckbApplyBaselineExposureOffset->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyBaselineExposureOffsetChanged));
@ -656,7 +485,6 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ConnectionBlocker obpcconn_(obpcconn); ConnectionBlocker obpcconn_(obpcconn);
ConnectionBlocker ipc_(ipc); ConnectionBlocker ipc_(ipc);
ConnectionBlocker coprofconn_(coprofconn);
ConnectionBlocker tcurveconn_(tcurveconn); ConnectionBlocker tcurveconn_(tcurveconn);
ConnectionBlocker ltableconn_(ltableconn); ConnectionBlocker ltableconn_(ltableconn);
ConnectionBlocker beoconn_(beoconn); ConnectionBlocker beoconn_(beoconn);
@ -664,11 +492,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ConnectionBlocker wprofnamesconn_(wprofnamesconn); ConnectionBlocker wprofnamesconn_(wprofnamesconn);
ConnectionBlocker oprofnamesconn_(oprofnamesconn); ConnectionBlocker oprofnamesconn_(oprofnamesconn);
ConnectionBlocker orendintentconn_(orendintentconn); ConnectionBlocker orendintentconn_(orendintentconn);
ConnectionBlocker otrcconn_(otrcconn);
ConnectionBlocker dcpillconn_(dcpillconn); ConnectionBlocker dcpillconn_(dcpillconn);
ConnectionBlocker primariesconn_(primariesconn);
ConnectionBlocker wprofileconn_(wprofileconn);
ConnectionBlocker oillconn_(oillconn);
if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) { if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) {
ipDialog->set_filename(pp->icm.inputProfile); ipDialog->set_filename(pp->icm.inputProfile);
@ -703,57 +527,6 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
} }
wProfNames->set_active_text(pp->icm.workingProfile); wProfNames->set_active_text(pp->icm.workingProfile);
oTRCPresets->set_active_text(pp->icm.outputGammaPreset);
if (pp->icm.outputPimariesPreset == "ACES-AP0") {
primaries->set_active(0);
} else if (pp->icm.outputPimariesPreset == "ACES-AP1") {
primaries->set_active(1);
} else if (pp->icm.outputPimariesPreset == "Adobe") {
primaries->set_active(2);
} else if (pp->icm.outputPimariesPreset == "ProPhoto") {
primaries->set_active(3);
} else if (pp->icm.outputPimariesPreset == "Rec2020") {
primaries->set_active(4);
} else if (pp->icm.outputPimariesPreset == "sRGB") {
primaries->set_active(5);
} else if (pp->icm.outputPimariesPreset == "Widegamut") {
primaries->set_active(6);
} else if (pp->icm.outputPimariesPreset == "BestRGB") {
primaries->set_active(7);
} else if (pp->icm.outputPimariesPreset == "BetaRGB") {
primaries->set_active(8);
} else if (pp->icm.outputPimariesPreset == "BruceRGB") {
primaries->set_active(9);
} else if (pp->icm.outputPimariesPreset == "pfree") {
primaries->set_active(10);
}
if (primaries->get_active_row_number() == 10) {
primariesVBox->set_sensitive(true);
} else {
primariesVBox->set_sensitive(false);
}
if (pp->icm.outputIlluminant == "DEF") {
oIlluminant->set_active(0);
} else if (pp->icm.outputIlluminant == "D41") {
oIlluminant->set_active(1);
} else if (pp->icm.outputIlluminant == "D50") {
oIlluminant->set_active(2);
} else if (pp->icm.outputIlluminant == "D55") {
oIlluminant->set_active(3);
} else if (pp->icm.outputIlluminant == "D60") {
oIlluminant->set_active(4);
} else if (pp->icm.outputIlluminant == "D65") {
oIlluminant->set_active(5);
} else if (pp->icm.outputIlluminant == "D80") {
oIlluminant->set_active(6);
} else if (pp->icm.outputIlluminant == "stdA") {
oIlluminant->set_active(7);
}
if (pp->icm.workingTRC == "none") { if (pp->icm.workingTRC == "none") {
wTRC->set_active(0); wTRC->set_active(0);
@ -761,23 +534,6 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
wTRC->set_active(1); wTRC->set_active(1);
} }
if (pp->icm.outputProfileVersion == "none") {
wprofile->set_active(0);
} else if (pp->icm.outputProfileVersion == "v2") {
wprofile->set_active(1);
} else if (pp->icm.outputProfileVersion == "v4") {
wprofile->set_active(2);
}
if (primaries->get_active_row_number() == 10) {
wprofile->set_active(2);
}
gpChanged();
wprofileChanged();
wtempChanged();
wprimariesChanged();
wtrcinChanged(); wtrcinChanged();
if (pp->icm.outputProfile == ColorManagementParams::NoICMString) { if (pp->icm.outputProfile == ColorManagementParams::NoICMString) {
@ -802,40 +558,8 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ckbApplyHueSatMap->set_active(pp->icm.applyHueSatMap); ckbApplyHueSatMap->set_active(pp->icm.applyHueSatMap);
lastApplyHueSatMap = pp->icm.applyHueSatMap; lastApplyHueSatMap = pp->icm.applyHueSatMap;
customOutProfile->set_active(pp->icm.customOutputProfile); wGamma->setValue(pp->icm.workingTRCGamma);
lastCustomOutputProfile = pp->icm.customOutputProfile; wSlope->setValue(pp->icm.workingTRCSlope);
if (!batchMode) {
oProfNames->set_sensitive(/*wgamma->get_active_row_number() == 0 &&*/ !pp->icm.customOutputProfile); //"default"
oTRCPresets->set_sensitive(pp->icm.customOutputProfile);
oGamma->set_sensitive(pp->icm.customOutputProfile);
oGamma->set_sensitive(pp->icm.outputGammaPreset == "Custom");
oSlope->set_sensitive(pp->icm.customOutputProfile);
oSlope->set_sensitive(pp->icm.outputGammaPreset == "Custom");
updateRenderingIntent(pp->icm.outputProfile);
primaries->set_sensitive(pp->icm.customOutputProfile);
wprofile->set_sensitive(pp->icm.customOutputProfile);
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(pp->icm.customOutputProfile);
} else {
oIlluminant->set_sensitive(false);
}
// wtemp->set_sensitive(pp->icm.freegamma);
}
oGamma->setValue(pp->icm.workingTRCGamma);
oSlope->setValue(pp->icm.workingTRCSlope);
primariesRedX->setValue(pp->icm.redPrimaryX);
primariesRedY->setValue(pp->icm.redPrimaryY);
primariesGreenX->setValue(pp->icm.greenPrimaryX);
primariesGreenY->setValue(pp->icm.greenPrimaryY);
primariesBlueX->setValue(pp->icm.bluePrimaryX);
primariesBlueY->setValue(pp->icm.bluePrimaryY);
wGamma->setValue(pp->icm.outputGamma);
wSlope->setValue(pp->icm.outputSlope);
if (pedited) { if (pedited) {
iunchanged->set_active(!pedited->icm.inputProfile); iunchanged->set_active(!pedited->icm.inputProfile);
@ -844,7 +568,6 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ckbApplyLookTable->set_inconsistent(!pedited->icm.applyLookTable); ckbApplyLookTable->set_inconsistent(!pedited->icm.applyLookTable);
ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset); ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset);
ckbApplyHueSatMap->set_inconsistent(!pedited->icm.applyHueSatMap); ckbApplyHueSatMap->set_inconsistent(!pedited->icm.applyHueSatMap);
customOutProfile->set_inconsistent(!pedited->icm.customOutputProfile);
if (!pedited->icm.workingProfile) { if (!pedited->icm.workingProfile) {
wProfNames->set_active_text(M("GENERAL_UNCHANGED")); wProfNames->set_active_text(M("GENERAL_UNCHANGED"));
@ -862,36 +585,12 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
dcpIll->set_active_text(M("GENERAL_UNCHANGED")); dcpIll->set_active_text(M("GENERAL_UNCHANGED"));
} }
if (!pedited->icm.outputGammaPreset) {
oTRCPresets->set_active_text(M("GENERAL_UNCHANGED"));
}
if (!pedited->icm.outputPrimariesPreset) {
primaries->set_active_text(M("GENERAL_UNCHANGED"));
}
if (!pedited->icm.outputProfileVersion) {
wprofile->set_active_text(M("GENERAL_UNCHANGED"));
}
if (!pedited->icm.outputIlluminant) {
oIlluminant->set_active_text(M("GENERAL_UNCHANGED"));
}
if (!pedited->icm.workingTRC) { if (!pedited->icm.workingTRC) {
wTRC->set_active_text(M("GENERAL_UNCHANGED")); wTRC->set_active_text(M("GENERAL_UNCHANGED"));
} }
oGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
oSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); wSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited);
primariesRedX->setEditedState(pedited->icm.redPrimaryX ? Edited : UnEdited);
primariesRedY->setEditedState(pedited->icm.redPrimaryY ? Edited : UnEdited);
primariesGreenX->setEditedState(pedited->icm.greenPrimaryX ? Edited : UnEdited);
primariesGreenY->setEditedState(pedited->icm.greenPrimaryY ? Edited : UnEdited);
primariesBlueX->setEditedState(pedited->icm.bluePrimaryX ? Edited : UnEdited);
primariesBlueY->setEditedState(pedited->icm.bluePrimaryY ? Edited : UnEdited);
wGamma->setEditedState(pedited->icm.outputGamma ? Edited : UnEdited);
wSlope->setEditedState(pedited->icm.outputSlope ? Edited : UnEdited);
} }
@ -920,10 +619,7 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited)
} }
pp->icm.workingProfile = wProfNames->get_active_text(); pp->icm.workingProfile = wProfNames->get_active_text();
pp->icm.outputGammaPreset = oTRCPresets->get_active_text();
pp->icm.dcpIlluminant = rtengine::max<int>(dcpIll->get_active_row_number(), 0); pp->icm.dcpIlluminant = rtengine::max<int>(dcpIll->get_active_row_number(), 0);
pp->icm.outputPimariesPreset = primaries->get_active_text();
pp->icm.outputIlluminant = oIlluminant->get_active_text();
pp->icm.workingTRC = wTRC->get_active_text(); pp->icm.workingTRC = wTRC->get_active_text();
if (oProfNames->get_active_text() == M("TP_ICM_NOICM")) { if (oProfNames->get_active_text() == M("TP_ICM_NOICM")) {
@ -940,78 +636,19 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited)
pp->icm.outputIntent = rtengine::RI_RELATIVE; pp->icm.outputIntent = rtengine::RI_RELATIVE;
} }
if (wprofile->get_active_row_number() == 0) {
pp->icm.outputProfileVersion = "none";
} else if (wprofile->get_active_row_number() == 1) {
pp->icm.outputProfileVersion = "v2";
} else if (wprofile->get_active_row_number() == 2) {
pp->icm.outputProfileVersion = "v4";
}
if (primaries->get_active_row_number() == 0) {
pp->icm.outputPimariesPreset = "ACES-AP0";
} else if (primaries->get_active_row_number() == 1) {
pp->icm.outputPimariesPreset = "ACES-AP1";
} else if (primaries->get_active_row_number() == 2) {
pp->icm.outputPimariesPreset = "Adobe";
} else if (primaries->get_active_row_number() == 3) {
pp->icm.outputPimariesPreset = "ProPhoto";
} else if (primaries->get_active_row_number() == 4) {
pp->icm.outputPimariesPreset = "Rec2020";
} else if (primaries->get_active_row_number() == 5) {
pp->icm.outputPimariesPreset = "sRGB";
} else if (primaries->get_active_row_number() == 6) {
pp->icm.outputPimariesPreset = "Widegamut";
} else if (primaries->get_active_row_number() == 7) {
pp->icm.outputPimariesPreset = "BestRGB";
} else if (primaries->get_active_row_number() == 8) {
pp->icm.outputPimariesPreset = "BetaRGB";
} else if (primaries->get_active_row_number() == 9) {
pp->icm.outputPimariesPreset = "BruceRGB";
} else if (primaries->get_active_row_number() == 10) {
pp->icm.outputPimariesPreset = "pfree";
}
if (oIlluminant->get_active_row_number() == 0) {
pp->icm.outputIlluminant = "DEF";
} else if (oIlluminant->get_active_row_number() == 1) {
pp->icm.outputIlluminant = "D41";
} else if (oIlluminant->get_active_row_number() == 2) {
pp->icm.outputIlluminant = "D50";
} else if (oIlluminant->get_active_row_number() == 3) {
pp->icm.outputIlluminant = "D55";
} else if (oIlluminant->get_active_row_number() == 4) {
pp->icm.outputIlluminant = "D60";
} else if (oIlluminant->get_active_row_number() == 5) {
pp->icm.outputIlluminant = "D65";
} else if (oIlluminant->get_active_row_number() == 6) {
pp->icm.outputIlluminant = "D80";
} else if (oIlluminant->get_active_row_number() == 7) {
pp->icm.outputIlluminant = "stdA";
}
if (wTRC->get_active_row_number() == 0) { if (wTRC->get_active_row_number() == 0) {
pp->icm.workingTRC = "none"; pp->icm.workingTRC = "none";
} else if (wTRC->get_active_row_number() == 1) { } else if (wTRC->get_active_row_number() == 1) {
pp->icm.workingTRC = "Custom"; pp->icm.workingTRC = "Custom";
} }
pp->icm.customOutputProfile = customOutProfile->get_active();
pp->icm.toneCurve = ckbToneCurve->get_active(); pp->icm.toneCurve = ckbToneCurve->get_active();
pp->icm.applyLookTable = ckbApplyLookTable->get_active(); pp->icm.applyLookTable = ckbApplyLookTable->get_active();
pp->icm.applyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active(); pp->icm.applyBaselineExposureOffset = ckbApplyBaselineExposureOffset->get_active();
pp->icm.applyHueSatMap = ckbApplyHueSatMap->get_active(); pp->icm.applyHueSatMap = ckbApplyHueSatMap->get_active();
pp->icm.workingTRCGamma = (double) oGamma->getValue();
pp->icm.workingTRCSlope = (double) oSlope->getValue();
pp->icm.outputBPC = obpc->get_active(); pp->icm.outputBPC = obpc->get_active();
pp->icm.redPrimaryX = (double) primariesRedX->getValue(); pp->icm.workingTRCGamma = (double) wGamma->getValue();
pp->icm.redPrimaryY = (double) primariesRedY->getValue(); pp->icm.workingTRCSlope = (double) wSlope->getValue();
pp->icm.greenPrimaryX = (double) primariesGreenX->getValue();
pp->icm.greenPrimaryY = (double) primariesGreenY->getValue();
pp->icm.bluePrimaryX = (double) primariesBlueX->getValue();
pp->icm.bluePrimaryY = (double) primariesBlueY->getValue();
pp->icm.outputGamma = (double) wGamma->getValue();
pp->icm.outputSlope = (double) wSlope->getValue();
if (pedited) { if (pedited) {
pedited->icm.inputProfile = !iunchanged->get_active(); pedited->icm.inputProfile = !iunchanged->get_active();
@ -1024,98 +661,30 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited)
pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent(); pedited->icm.applyLookTable = !ckbApplyLookTable->get_inconsistent();
pedited->icm.applyBaselineExposureOffset = !ckbApplyBaselineExposureOffset->get_inconsistent(); pedited->icm.applyBaselineExposureOffset = !ckbApplyBaselineExposureOffset->get_inconsistent();
pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent(); pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent();
pedited->icm.outputGammaPreset = oTRCPresets->get_active_text() != M("GENERAL_UNCHANGED"); pedited->icm.workingTRCGamma = wGamma->getEditedState();
pedited->icm.customOutputProfile = !customOutProfile->get_inconsistent(); pedited->icm.workingTRCSlope = wSlope->getEditedState();
pedited->icm.workingTRCGamma = oGamma->getEditedState();
pedited->icm.workingTRCSlope = oSlope->getEditedState();
pedited->icm.redPrimaryX = primariesRedX->getEditedState();
pedited->icm.redPrimaryY = primariesRedY->getEditedState();
pedited->icm.greenPrimaryX = primariesGreenX->getEditedState();
pedited->icm.greenPrimaryY = primariesGreenY->getEditedState();
pedited->icm.bluePrimaryX = primariesBlueX->getEditedState();
pedited->icm.bluePrimaryY = primariesBlueY->getEditedState();
pedited->icm.outputGamma = wGamma->getEditedState();
pedited->icm.outputSlope = wSlope->getEditedState();
pedited->icm.outputPrimariesPreset = primaries->get_active_text() != M("GENERAL_UNCHANGED");
pedited->icm.outputProfileVersion = wprofile->get_active_text() != M("GENERAL_UNCHANGED");
pedited->icm.outputIlluminant = oIlluminant->get_active_text() != M("GENERAL_UNCHANGED");
pedited->icm.workingTRC = wTRC->get_active_text() != M("GENERAL_UNCHANGED"); pedited->icm.workingTRC = wTRC->get_active_text() != M("GENERAL_UNCHANGED");
} }
} }
void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited) void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited)
{ {
oGamma->setDefault(defParams->icm.workingTRCGamma); wGamma->setDefault(defParams->icm.workingTRCGamma);
oSlope->setDefault(defParams->icm.workingTRCSlope); wSlope->setDefault(defParams->icm.workingTRCSlope);
primariesRedX->setDefault(defParams->icm.redPrimaryX);
primariesRedY->setDefault(defParams->icm.redPrimaryY);
primariesGreenX->setDefault(defParams->icm.greenPrimaryX);
primariesGreenY->setDefault(defParams->icm.greenPrimaryY);
primariesBlueX->setDefault(defParams->icm.bluePrimaryX);
primariesBlueY->setDefault(defParams->icm.bluePrimaryY);
wGamma->setDefault(defParams->icm.outputGamma);
wSlope->setDefault(defParams->icm.outputSlope);
if (pedited) { if (pedited) {
oGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited); wGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
oSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited); wSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited);
primariesRedX->setDefaultEditedState(pedited->icm.redPrimaryX ? Edited : UnEdited);
primariesRedY->setDefaultEditedState(pedited->icm.redPrimaryY ? Edited : UnEdited);
primariesGreenX->setDefaultEditedState(pedited->icm.greenPrimaryX ? Edited : UnEdited);
primariesGreenY->setDefaultEditedState(pedited->icm.greenPrimaryY ? Edited : UnEdited);
primariesBlueX->setDefaultEditedState(pedited->icm.bluePrimaryX ? Edited : UnEdited);
primariesBlueY->setDefaultEditedState(pedited->icm.bluePrimaryY ? Edited : UnEdited);
wGamma->setDefaultEditedState(pedited->icm.outputGamma ? Edited : UnEdited);
wSlope->setDefaultEditedState(pedited->icm.outputSlope ? Edited : UnEdited);
} else { } else {
oGamma->setDefaultEditedState(Irrelevant);
oSlope->setDefaultEditedState(Irrelevant);
primariesRedX->setDefaultEditedState(Irrelevant);
primariesRedY->setDefaultEditedState(Irrelevant);
primariesGreenX->setDefaultEditedState(Irrelevant);
primariesGreenY->setDefaultEditedState(Irrelevant);
primariesBlueX->setDefaultEditedState(Irrelevant);
primariesBlueY->setDefaultEditedState(Irrelevant);
wGamma->setDefaultEditedState(Irrelevant); wGamma->setDefaultEditedState(Irrelevant);
wSlope->setDefaultEditedState(Irrelevant); wSlope->setDefaultEditedState(Irrelevant);
} }
} }
void ICMPanel::setAdjusterBehavior(bool gammaadd, bool slopeadd)
{
oGamma->setAddMode(gammaadd);
oSlope->setAddMode(slopeadd);
}
void ICMPanel::adjusterChanged(Adjuster* a, double newval) void ICMPanel::adjusterChanged(Adjuster* a, double newval)
{ {
if (listener && (customOutProfile->get_active() || batchMode)) {
Glib::ustring costr = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), newval);
if (a == oGamma) {
listener->panelChanged(EvGAMPOS, costr);
} else if (a == oSlope) {
listener->panelChanged(EvSLPOS, costr);
} else if (a == primariesRedX) {
listener->panelChanged(EvICMpredx, costr);
} else if (a == primariesRedY) {
listener->panelChanged(EvICMpredy, costr);
} else if (a == primariesGreenX) {
listener->panelChanged(EvICMpgrex, costr);
} else if (a == primariesGreenY) {
listener->panelChanged(EvICMpgrey, costr);
} else if (a == primariesBlueX) {
listener->panelChanged(EvICMpblux, costr);
} else if (a == primariesBlueY) {
listener->panelChanged(EvICMpbluy, costr);
}
}
if (listener || batchMode) { if (listener || batchMode) {
Glib::ustring costr2 = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), newval); Glib::ustring costr2 = Glib::ustring::format(std::setw(3), std::fixed, std::setprecision(2), newval);
@ -1130,51 +699,11 @@ void ICMPanel::adjusterChanged(Adjuster* a, double newval)
void ICMPanel::wpChanged() void ICMPanel::wpChanged()
{ {
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
} else {
oIlluminant->set_sensitive(false);
}
if (listener) { if (listener) {
listener->panelChanged(EvWProfile, wProfNames->get_active_text()); listener->panelChanged(EvWProfile, wProfNames->get_active_text());
} }
} }
void ICMPanel::wprimariesChanged()
{
if (primaries->get_active_row_number() == 10) {
primariesVBox->set_sensitive(true);
} else {
primariesVBox->set_sensitive(false);
}
if (primaries->get_active_row_number() == 10) {
wprofile->set_active(2);
}
if (listener) {
listener->panelChanged(EvICMprimariMethod, primaries->get_active_text());
}
}
void ICMPanel::wtempChanged()
{
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
} else {
oIlluminant->set_sensitive(false);
}
if (oIlluminant->get_active_row_number() != 0) {
wprofile->set_active(2);
}
if (listener) {
listener->panelChanged(EvICMtempMethod, oIlluminant->get_active_text());
}
}
void ICMPanel::wtrcinChanged() void ICMPanel::wtrcinChanged()
{ {
if (wTRC->get_active_row_number() == 0) { if (wTRC->get_active_row_number() == 0) {
@ -1191,40 +720,6 @@ void ICMPanel::wtrcinChanged()
} }
} }
void ICMPanel::wprofileChanged()
{
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
} else {
oIlluminant->set_sensitive(false);
}
if (oIlluminant->get_active_row_number() != 0) {
wprofile->set_active(2);
}
if (listener) {
listener->panelChanged(EvICMprofileMethod, wprofile->get_active_text());
}
}
void ICMPanel::gpChanged()
{
if (oTRCPresets->get_active_row_number() == 0) {
oGamma->set_sensitive(true);
oSlope->set_sensitive(true);
} else {
oGamma->set_sensitive(false);
oSlope->set_sensitive(false);
}
if (listener) {
listener->panelChanged(EvGAMMA, oTRCPresets->get_active_text());
oProfNames->set_sensitive(oTRCPresets->get_active_row_number() == 0);
}
}
void ICMPanel::dcpIlluminantChanged() void ICMPanel::dcpIlluminantChanged()
{ {
if (listener) { if (listener) {
@ -1336,19 +831,6 @@ void ICMPanel::applyHueSatMapChanged()
} }
} }
void ICMPanel::TRCChanged(double gamm, double slo)
{
GThreadLock lock;
disableListener();
setEnabled(true);
oGamma->setValue(gamm);
oSlope->setValue(slo);
oGamma->setDefault(gamm);
oSlope->setDefault(slo);
enableListener();
}
void ICMPanel::ipChanged() void ICMPanel::ipChanged()
{ {
@ -1375,111 +857,6 @@ void ICMPanel::ipChanged()
oldip = profname; oldip = profname;
} }
void ICMPanel::GamChanged()
{
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
} else {
oIlluminant->set_sensitive(false);
}
if (multiImage) {
if (customOutProfile->get_inconsistent()) {
customOutProfile->set_inconsistent(false);
coprofconn.block(true);
customOutProfile->set_active(false);
coprofconn.block(false);
} else if (lastCustomOutputProfile) {
customOutProfile->set_inconsistent(true);
}
lastCustomOutputProfile = customOutProfile->get_active();
}
if (listener) {
if (customOutProfile->get_inconsistent()) {
listener->panelChanged(EvGAMFREE, M("GENERAL_UNCHANGED"));
} else if (customOutProfile->get_active()) {
listener->panelChanged(EvGAMFREE, M("GENERAL_ENABLED"));
if (!batchMode) {
oProfNames->set_sensitive(false);//disabled choice
oTRCPresets->show();
oGamma->show();
oSlope->show();
primaries->show();
wprofile->show();
oIlluminant->show();
oTRCPresets->set_sensitive(true);
oGamma->set_sensitive(true);
oSlope->set_sensitive(true);
primaries->set_sensitive(true);
wprofile->set_sensitive(true);
//wtemp->set_sensitive(true);
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
}
primariesHBox->show();
primariesVBox->show();
primariesHBox->set_sensitive(true);
if (primaries->get_active_row_number() == 10) {
primariesVBox->set_sensitive(true);
} else {
primariesVBox->set_sensitive(false);
}
oTRCPresetsHBox->show();
profHBox->show();
oIllHBox->show();
oTRCPresetsHBox->set_sensitive(true);
profHBox->set_sensitive(true);
oIllHBox->set_sensitive(true);
}
} else {
listener->panelChanged(EvGAMFREE, M("GENERAL_DISABLED"));
if (!batchMode) {
oProfNames->set_sensitive(true);
oTRCPresets->hide();
oGamma->hide();
oSlope->hide();
primaries->hide();
wprofile->hide();
oIlluminant->hide();
oTRCPresets->set_sensitive(false);
oGamma->set_sensitive(false);
oSlope->set_sensitive(false);
primaries->set_sensitive(false);
wprofile->set_sensitive(false);
if (wprofile->get_active_row_number() != 2) {
oIlluminant->set_sensitive(false);
}
primariesHBox->hide();
primariesVBox->hide();
oTRCPresetsHBox->hide();
profHBox->hide();
oIllHBox->hide();
primariesHBox->set_sensitive(false);
primariesVBox->set_sensitive(false);
oTRCPresetsHBox->set_sensitive(false);
profHBox->set_sensitive(false);
oIllHBox->set_sensitive(false);
}
}
}
}
void ICMPanel::opChanged() void ICMPanel::opChanged()
{ {
if (!batchMode) { if (!batchMode) {
@ -1650,14 +1027,8 @@ void ICMPanel::setBatchMode(bool batchMode)
oRendIntent->addEntry("unchanged-22.png", M("GENERAL_UNCHANGED")); oRendIntent->addEntry("unchanged-22.png", M("GENERAL_UNCHANGED"));
oRendIntent->show(); oRendIntent->show();
wProfNames->append(M("GENERAL_UNCHANGED")); wProfNames->append(M("GENERAL_UNCHANGED"));
oTRCPresets->append(M("GENERAL_UNCHANGED"));
primaries->append(M("GENERAL_UNCHANGED"));
wprofile->append(M("GENERAL_UNCHANGED"));
oIlluminant->append(M("GENERAL_UNCHANGED"));
wTRC->append(M("GENERAL_UNCHANGED")); wTRC->append(M("GENERAL_UNCHANGED"));
dcpIll->append(M("GENERAL_UNCHANGED")); dcpIll->append(M("GENERAL_UNCHANGED"));
oGamma->showEditedCB();
oSlope->showEditedCB();
wGamma->showEditedCB(); wGamma->showEditedCB();
wSlope->showEditedCB(); wSlope->showEditedCB();
} }

View File

@ -39,22 +39,13 @@ public:
class ICMPanel : class ICMPanel :
public ToolParamBlock, public ToolParamBlock,
public AdjusterListener, public AdjusterListener,
public FoldableToolPanel, public FoldableToolPanel
public rtengine::ICMListener
{ {
protected: protected:
Gtk::Frame* dcpFrame; Gtk::Frame* dcpFrame;
Gtk::Frame* coipFrame; Gtk::Frame* coipFrame;
Adjuster* oGamma;
Adjuster* oSlope;
Adjuster* primariesRedX;
Adjuster* primariesRedY;
Adjuster* primariesGreenX;
Adjuster* primariesGreenY;
Adjuster* primariesBlueX;
Adjuster* primariesBlueY;
Adjuster* wGamma; Adjuster* wGamma;
Adjuster* wSlope; Adjuster* wSlope;
@ -62,8 +53,6 @@ protected:
Gtk::HBox* gabox; Gtk::HBox* gabox;
bool lastCustomOutputProfile;
sigc::connection coprofconn;
//bool freegamma; //bool freegamma;
bool lastToneCurve; bool lastToneCurve;
sigc::connection tcurveconn; sigc::connection tcurveconn;
@ -91,57 +80,39 @@ private:
rtengine::ProcEvent EvICMslop; rtengine::ProcEvent EvICMslop;
rtengine::ProcEvent EvICMtrcinMethod; rtengine::ProcEvent EvICMtrcinMethod;
Gtk::VBox * iVBox; Gtk::VBox* iVBox;
Gtk::HBox* primariesHBox;
Gtk::HBox* oTRCPresetsHBox;
Gtk::HBox* profHBox;
Gtk::HBox* oIllHBox;
Gtk::VBox* primariesVBox;
Gtk::HBox* wTRCHBox; Gtk::HBox* wTRCHBox;
Gtk::HBox* priGreenHBox;
Gtk::HBox* priBlueHBox;
Gtk::HBox* oTRCHBox;
Gtk::HBox* priRedHBox;
Gtk::CheckButton* obpc; Gtk::CheckButton* obpc;
Gtk::CheckButton* customOutProfile; Gtk::RadioButton* inone;
Gtk::RadioButton* inone;
Gtk::RadioButton* iembedded; Gtk::RadioButton* iembedded;
Gtk::RadioButton* icamera; Gtk::RadioButton* icamera;
Gtk::RadioButton* icameraICC; Gtk::RadioButton* icameraICC;
Gtk::RadioButton* ifromfile; Gtk::RadioButton* ifromfile;
Gtk::Label* dcpIllLabel; Gtk::Label* dcpIllLabel;
MyComboBoxText* dcpIll; MyComboBoxText* dcpIll;
sigc::connection dcpillconn; sigc::connection dcpillconn;
Gtk::CheckButton* ckbToneCurve; Gtk::CheckButton* ckbToneCurve;
Gtk::CheckButton* ckbApplyLookTable; Gtk::CheckButton* ckbApplyLookTable;
Gtk::CheckButton* ckbApplyBaselineExposureOffset; Gtk::CheckButton* ckbApplyBaselineExposureOffset;
Gtk::CheckButton* ckbApplyHueSatMap; Gtk::CheckButton* ckbApplyHueSatMap;
MyComboBoxText* wProfNames; MyComboBoxText* wProfNames;
sigc::connection wprofnamesconn; sigc::connection wprofnamesconn;
MyComboBoxText* oTRCPresets; MyComboBoxText* wTRC;
sigc::connection otrcconn; sigc::connection wtrcconn;
MyComboBoxText* primaries;
sigc::connection primariesconn;
MyComboBoxText* wprofile;
sigc::connection wprofileconn;
MyComboBoxText* oIlluminant;
sigc::connection oillconn;
MyComboBoxText* wTRC;
sigc::connection wtrcconn;
MyComboBoxText* oProfNames; MyComboBoxText* oProfNames;
sigc::connection oprofnamesconn; sigc::connection oprofnamesconn;
std::unique_ptr<PopUpButton> oRendIntent; std::unique_ptr<PopUpButton> oRendIntent;
sigc::connection orendintentconn; sigc::connection orendintentconn;
Gtk::RadioButton* iunchanged; Gtk::RadioButton* iunchanged;
MyFileChooserButton* ipDialog; MyFileChooserButton* ipDialog;
Gtk::RadioButton::Group opts; Gtk::RadioButton::Group opts;
Gtk::Button* saveRef; Gtk::Button* saveRef;
sigc::connection ipc; sigc::connection ipc;
Glib::ustring oldip; Glib::ustring oldip;
ICMPanelListener* icmplistener; ICMPanelListener* icmplistener;
double dcpTemperatures[2]; double dcpTemperatures[2];
Glib::ustring lastRefFilename; Glib::ustring lastRefFilename;
@ -156,26 +127,19 @@ public:
void setBatchMode(bool batchMode); void setBatchMode(bool batchMode);
void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr); void setDefaults(const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void adjusterChanged(Adjuster* a, double newval); void adjusterChanged(Adjuster* a, double newval);
void setAdjusterBehavior(bool gammaadd, bool slopeadd);
void wpChanged(); void wpChanged();
void wprimariesChanged();
void wprofileChanged();
void wtempChanged();
void wtrcinChanged(); void wtrcinChanged();
void opChanged(); void opChanged();
void oiChanged(int n); void oiChanged(int n);
void oBPCChanged(); void oBPCChanged();
void ipChanged(); void ipChanged();
void gpChanged();
void GamChanged();
void ipSelectionChanged(); void ipSelectionChanged();
void dcpIlluminantChanged(); void dcpIlluminantChanged();
void toneCurveChanged(); void toneCurveChanged();
void applyLookTableChanged(); void applyLookTableChanged();
void applyBaselineExposureOffsetChanged(); void applyBaselineExposureOffsetChanged();
void applyHueSatMapChanged(); void applyHueSatMapChanged();
void TRCChanged(double gamm, double slo);
void setRawMeta(bool raw, const rtengine::FramesData* pMeta); void setRawMeta(bool raw, const rtengine::FramesData* pMeta);
void saveReferencePressed(); void saveReferencePressed();

View File

@ -198,6 +198,9 @@ void Options::updatePaths()
lastBWCurvesDir = preferredPath; lastBWCurvesDir = preferredPath;
} }
if (lastICCProfCreatorDir.empty() || !Glib::file_test(lastICCProfCreatorDir, Glib::FILE_TEST_EXISTS) || !Glib::file_test(lastICCProfCreatorDir, Glib::FILE_TEST_IS_DIR)) {
lastICCProfCreatorDir = preferredPath;
}
} }
Glib::ustring Options::getPreferredProfilePath() Glib::ustring Options::getPreferredProfilePath()
@ -440,6 +443,19 @@ void Options::setDefaults()
menuGroupProfileOperations = true; menuGroupProfileOperations = true;
menuGroupExtProg = true; menuGroupExtProg = true;
ICCPC_primariesPreset = "sRGB",
ICCPC_redPrimaryX = 0.6400;
ICCPC_redPrimaryY = 0.3300;
ICCPC_greenPrimaryX = 0.3000;
ICCPC_greenPrimaryY = 0.6000;
ICCPC_bluePrimaryX = 0.1500;
ICCPC_bluePrimaryY = 0.0600;
ICCPC_gammaPreset = "Custom";
ICCPC_gamma = 2.4;
ICCPC_slope = 12.92;
ICCPC_profileVersion = "v4";
ICCPC_illuminant = "DEF";
fastexport_bypass_sharpening = true; fastexport_bypass_sharpening = true;
fastexport_bypass_sharpenEdge = true; fastexport_bypass_sharpenEdge = true;
fastexport_bypass_sharpenMicro = true; fastexport_bypass_sharpenMicro = true;
@ -466,7 +482,6 @@ void Options::setDefaults()
fastexport_icm_output_profile = "RT_sRGB"; fastexport_icm_output_profile = "RT_sRGB";
fastexport_icm_outputIntent = rtengine::RI_RELATIVE; fastexport_icm_outputIntent = rtengine::RI_RELATIVE;
fastexport_icm_outputBPC = true; fastexport_icm_outputBPC = true;
fastexport_icm_custom_output_profile = "Custom";
fastexport_resize_enabled = true; fastexport_resize_enabled = true;
fastexport_resize_scale = 1; fastexport_resize_scale = 1;
fastexport_resize_appliesTo = "Cropped area"; fastexport_resize_appliesTo = "Cropped area";
@ -588,6 +603,7 @@ void Options::setDefaults()
lastProfilingReferenceDir = ""; lastProfilingReferenceDir = "";
lastBWCurvesDir = ""; lastBWCurvesDir = "";
lastLensProfileDir = ""; lastLensProfileDir = "";
lastICCProfCreatorDir = "";
gimpPluginShowInfoDialog = true; gimpPluginShowInfoDialog = true;
maxRecentFolders = 15; maxRecentFolders = 15;
rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc rtSettings.lensfunDbDirectory = ""; // set also in main.cc and main-cli.cc
@ -1473,6 +1489,14 @@ void Options::readFromFile(Glib::ustring fname)
rtSettings.bruce = keyFile.get_string("Color Management", "Bruce"); rtSettings.bruce = keyFile.get_string("Color Management", "Bruce");
} }
if (keyFile.has_key("Color Management", "ACES-AP0")) {
rtSettings.ACESp0 = keyFile.get_string("Color Management", "ACES-AP0");
}
if (keyFile.has_key("Color Management", "ACES-AP1")) {
rtSettings.ACESp1 = keyFile.get_string("Color Management", "ACES-AP1");
}
if (keyFile.has_key("Color Management", "GamutLch")) { if (keyFile.has_key("Color Management", "GamutLch")) {
rtSettings.gamutLch = keyFile.get_boolean("Color Management", "GamutLch"); rtSettings.gamutLch = keyFile.get_boolean("Color Management", "GamutLch");
} }
@ -1497,6 +1521,45 @@ void Options::readFromFile(Glib::ustring fname)
} }
if (keyFile.has_group("ICC Profile Creator")) {
if (keyFile.has_key("ICC Profile Creator", "PimariesPreset")) {
ICCPC_primariesPreset = keyFile.get_string("ICC Profile Creator", "PimariesPreset");
}
if (keyFile.has_key("ICC Profile Creator", "RedPrimaryX")) {
ICCPC_redPrimaryX = keyFile.get_double("ICC Profile Creator", "RedPrimaryX");
}
if (keyFile.has_key("ICC Profile Creator", "RedPrimaryY")) {
ICCPC_redPrimaryY = keyFile.get_double("ICC Profile Creator", "RedPrimaryY");
}
if (keyFile.has_key("ICC Profile Creator", "GreenPrimaryX")) {
ICCPC_greenPrimaryX = keyFile.get_double("ICC Profile Creator", "GreenPrimaryX");
}
if (keyFile.has_key("ICC Profile Creator", "GreenPrimaryY")) {
ICCPC_greenPrimaryY = keyFile.get_double("ICC Profile Creator", "GreenPrimaryY");
}
if (keyFile.has_key("ICC Profile Creator", "BluePrimaryX")) {
ICCPC_bluePrimaryX = keyFile.get_double("ICC Profile Creator", "BluePrimaryX");
}
if (keyFile.has_key("ICC Profile Creator", "BluePrimaryY")) {
ICCPC_bluePrimaryY = keyFile.get_double("ICC Profile Creator", "BluePrimaryY");
}
if (keyFile.has_key("ICC Profile Creator", "GammaPreset")) {
ICCPC_gammaPreset = keyFile.get_string("ICC Profile Creator", "GammaPreset");
}
if (keyFile.has_key("ICC Profile Creator", "Gamma")) {
ICCPC_gamma = keyFile.get_double("ICC Profile Creator", "Gamma");
}
if (keyFile.has_key("ICC Profile Creator", "Slope")) {
ICCPC_slope = keyFile.get_double("ICC Profile Creator", "Slope");
}
if (keyFile.has_key("ICC Profile Creator", "ProfileVersion")) {
ICCPC_profileVersion = keyFile.get_string("ICC Profile Creator", "ProfileVersion");
}
if (keyFile.has_key("ICC Profile Creator", "Illuminant")) {
ICCPC_illuminant = keyFile.get_string("ICC Profile Creator", "Illuminant");
}
}
if (keyFile.has_group("Batch Processing")) { if (keyFile.has_group("Batch Processing")) {
if (keyFile.has_key("Batch Processing", "AdjusterBehavior")) { if (keyFile.has_key("Batch Processing", "AdjusterBehavior")) {
baBehav = keyFile.get_integer_list("Batch Processing", "AdjusterBehavior"); baBehav = keyFile.get_integer_list("Batch Processing", "AdjusterBehavior");
@ -1641,10 +1704,6 @@ void Options::readFromFile(Glib::ustring fname)
fastexport_icm_outputBPC = keyFile.get_boolean("Fast Export", "fastexport_icm_output_bpc"); fastexport_icm_outputBPC = keyFile.get_boolean("Fast Export", "fastexport_icm_output_bpc");
} }
if (keyFile.has_key("Fast Export", "fastexport_icm_gamma")) {
fastexport_icm_custom_output_profile = keyFile.get_string("Fast Export", "fastexport_icm_gamma");
}
if (keyFile.has_key("Fast Export", "fastexport_resize_enabled")) { if (keyFile.has_key("Fast Export", "fastexport_resize_enabled")) {
fastexport_resize_enabled = keyFile.get_boolean("Fast Export", "fastexport_resize_enabled"); fastexport_resize_enabled = keyFile.get_boolean("Fast Export", "fastexport_resize_enabled");
} }
@ -1695,6 +1754,7 @@ void Options::readFromFile(Glib::ustring fname)
safeDirGet(keyFile, "Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); safeDirGet(keyFile, "Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir);
safeDirGet(keyFile, "Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); safeDirGet(keyFile, "Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir);
safeDirGet(keyFile, "Dialogs", "LastLensProfileDir", lastLensProfileDir); safeDirGet(keyFile, "Dialogs", "LastLensProfileDir", lastLensProfileDir);
safeDirGet(keyFile, "Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir);
if (keyFile.has_key("Dialogs", "GimpPluginShowInfoDialog")) { if (keyFile.has_key("Dialogs", "GimpPluginShowInfoDialog")) {
gimpPluginShowInfoDialog = keyFile.get_boolean("Dialogs", "GimpPluginShowInfoDialog"); gimpPluginShowInfoDialog = keyFile.get_boolean("Dialogs", "GimpPluginShowInfoDialog");
@ -1987,6 +2047,8 @@ void Options::saveToFile(Glib::ustring fname)
keyFile.set_string("Color Management", "Best", rtSettings.best); keyFile.set_string("Color Management", "Best", rtSettings.best);
keyFile.set_string("Color Management", "Rec2020", rtSettings.rec2020); keyFile.set_string("Color Management", "Rec2020", rtSettings.rec2020);
keyFile.set_string("Color Management", "Bruce", rtSettings.bruce); keyFile.set_string("Color Management", "Bruce", rtSettings.bruce);
keyFile.set_string("Color Management", "ACES-AP0", rtSettings.ACESp0);
keyFile.set_string("Color Management", "ACES-AP1", rtSettings.ACESp1);
keyFile.set_integer("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize); keyFile.set_integer("Color Management", "WhiteBalanceSpotSize", whiteBalanceSpotSize);
keyFile.set_boolean("Color Management", "GamutICC", rtSettings.gamutICC); keyFile.set_boolean("Color Management", "GamutICC", rtSettings.gamutICC);
keyFile.set_boolean("Color Management", "GamutLch", rtSettings.gamutLch); keyFile.set_boolean("Color Management", "GamutLch", rtSettings.gamutLch);
@ -2002,6 +2064,18 @@ void Options::saveToFile(Glib::ustring fname)
//keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction); //keyFile.set_double ("Color Management", "Decaction", rtSettings.decaction);
keyFile.set_string("Color Management", "ClutsDirectory", clutsDir); keyFile.set_string("Color Management", "ClutsDirectory", clutsDir);
keyFile.set_string("ICC Profile Creator", "PimariesPreset", ICCPC_primariesPreset);
keyFile.set_double("ICC Profile Creator", "RedPrimaryX", ICCPC_redPrimaryX);
keyFile.set_double("ICC Profile Creator", "RedPrimaryY", ICCPC_redPrimaryY);
keyFile.set_double("ICC Profile Creator", "GreenPrimaryX", ICCPC_greenPrimaryX);
keyFile.set_double("ICC Profile Creator", "GreenPrimaryY", ICCPC_greenPrimaryY);
keyFile.set_double("ICC Profile Creator", "BluePrimaryX", ICCPC_bluePrimaryX);
keyFile.set_double("ICC Profile Creator", "BluePrimaryY", ICCPC_bluePrimaryY);
keyFile.set_string("ICC Profile Creator", "GammaPreset", ICCPC_gammaPreset);
keyFile.set_double("ICC Profile Creator", "Gamma", ICCPC_gamma);
keyFile.set_double("ICC Profile Creator", "Slope", ICCPC_slope);
keyFile.set_string("ICC Profile Creator", "ProfileVersion", ICCPC_profileVersion);
keyFile.set_string("ICC Profile Creator", "Illuminant", ICCPC_illuminant);
Glib::ArrayHandle<int> bab = baBehav; Glib::ArrayHandle<int> bab = baBehav;
keyFile.set_integer_list("Batch Processing", "AdjusterBehavior", bab); keyFile.set_integer_list("Batch Processing", "AdjusterBehavior", bab);
@ -2038,7 +2112,6 @@ void Options::saveToFile(Glib::ustring fname)
keyFile.set_string("Fast Export", "fastexport_icm_output", fastexport_icm_output_profile); keyFile.set_string("Fast Export", "fastexport_icm_output", fastexport_icm_output_profile);
keyFile.set_integer("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent); keyFile.set_integer("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent);
keyFile.set_boolean("Fast Export", "fastexport_icm_output_bpc", fastexport_icm_outputBPC); keyFile.set_boolean("Fast Export", "fastexport_icm_output_bpc", fastexport_icm_outputBPC);
keyFile.set_string("Fast Export", "fastexport_icm_gamma", fastexport_icm_custom_output_profile);
keyFile.set_boolean("Fast Export", "fastexport_resize_enabled", fastexport_resize_enabled); keyFile.set_boolean("Fast Export", "fastexport_resize_enabled", fastexport_resize_enabled);
keyFile.set_double("Fast Export", "fastexport_resize_scale", fastexport_resize_scale); keyFile.set_double("Fast Export", "fastexport_resize_scale", fastexport_resize_scale);
keyFile.set_string("Fast Export", "fastexport_resize_appliesTo", fastexport_resize_appliesTo); keyFile.set_string("Fast Export", "fastexport_resize_appliesTo", fastexport_resize_appliesTo);
@ -2063,6 +2136,7 @@ void Options::saveToFile(Glib::ustring fname)
keyFile.set_string("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); keyFile.set_string("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir);
keyFile.set_string("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir); keyFile.set_string("Dialogs", "LastProfilingReferenceDir", lastProfilingReferenceDir);
keyFile.set_string("Dialogs", "LastLensProfileDir", lastLensProfileDir); keyFile.set_string("Dialogs", "LastLensProfileDir", lastLensProfileDir);
keyFile.set_string("Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir);
keyFile.set_boolean("Dialogs", "GimpPluginShowInfoDialog", gimpPluginShowInfoDialog); keyFile.set_boolean("Dialogs", "GimpPluginShowInfoDialog", gimpPluginShowInfoDialog);
keyFile.set_string("Lensfun", "DBDirectory", rtSettings.lensfunDbDirectory); keyFile.set_string("Lensfun", "DBDirectory", rtSettings.lensfunDbDirectory);

View File

@ -287,6 +287,20 @@ public:
bool menuGroupProfileOperations; bool menuGroupProfileOperations;
bool menuGroupExtProg; bool menuGroupExtProg;
// ICC Profile Creator
Glib::ustring ICCPC_primariesPreset;
double ICCPC_redPrimaryX;
double ICCPC_redPrimaryY;
double ICCPC_greenPrimaryX;
double ICCPC_greenPrimaryY;
double ICCPC_bluePrimaryX;
double ICCPC_bluePrimaryY;
Glib::ustring ICCPC_gammaPreset;
double ICCPC_gamma;
double ICCPC_slope;
Glib::ustring ICCPC_profileVersion;
Glib::ustring ICCPC_illuminant;
// fast export options // fast export options
bool fastexport_bypass_sharpening; bool fastexport_bypass_sharpening;
bool fastexport_bypass_sharpenEdge; bool fastexport_bypass_sharpenEdge;
@ -341,6 +355,7 @@ public:
Glib::ustring lastProfilingReferenceDir; Glib::ustring lastProfilingReferenceDir;
Glib::ustring lastBWCurvesDir; Glib::ustring lastBWCurvesDir;
Glib::ustring lastLensProfileDir; Glib::ustring lastLensProfileDir;
Glib::ustring lastICCProfCreatorDir;
bool gimpPluginShowInfoDialog; bool gimpPluginShowInfoDialog;
size_t maxRecentFolders; // max. number of recent folders stored in options file size_t maxRecentFolders; // max. number of recent folders stored in options file

View File

@ -387,21 +387,8 @@ void ParamsEdited::set(bool v)
icm.outputProfile = v; icm.outputProfile = v;
icm.outputIntent = v; icm.outputIntent = v;
icm.outputBPC = v; icm.outputBPC = v;
icm.outputGammaPreset = v;
icm.customOutputProfile = v;
icm.workingTRCGamma = v; icm.workingTRCGamma = v;
icm.workingTRCSlope = v; icm.workingTRCSlope = v;
icm.redPrimaryX = v;
icm.redPrimaryY = v;
icm.greenPrimaryX = v;
icm.greenPrimaryY = v;
icm.bluePrimaryX = v;
icm.bluePrimaryY = v;
icm.outputGamma = v;
icm.outputSlope = v;
icm.outputPrimariesPreset = v;
icm.outputProfileVersion = v;
icm.outputIlluminant = v;
icm.workingTRC = v; icm.workingTRC = v;
raw.bayersensor.method = v; raw.bayersensor.method = v;
raw.bayersensor.imageNum = v; raw.bayersensor.imageNum = v;
@ -950,21 +937,8 @@ void ParamsEdited::initFrom(const std::vector<rtengine::procparams::ProcParams>&
icm.outputProfile = icm.outputProfile && p.icm.outputProfile == other.icm.outputProfile; icm.outputProfile = icm.outputProfile && p.icm.outputProfile == other.icm.outputProfile;
icm.outputIntent = icm.outputIntent && p.icm.outputIntent == other.icm.outputIntent; icm.outputIntent = icm.outputIntent && p.icm.outputIntent == other.icm.outputIntent;
icm.outputBPC = icm.outputBPC && p.icm.outputBPC == other.icm.outputBPC ; icm.outputBPC = icm.outputBPC && p.icm.outputBPC == other.icm.outputBPC ;
icm.outputGammaPreset = icm.outputGammaPreset && p.icm.outputGammaPreset == other.icm.outputGammaPreset;
icm.customOutputProfile = icm.customOutputProfile && p.icm.customOutputProfile == other.icm.customOutputProfile;
icm.workingTRCGamma = icm.workingTRCGamma && p.icm.workingTRCGamma == other.icm.workingTRCGamma; icm.workingTRCGamma = icm.workingTRCGamma && p.icm.workingTRCGamma == other.icm.workingTRCGamma;
icm.workingTRCSlope = icm.workingTRCSlope && p.icm.workingTRCSlope == other.icm.workingTRCSlope; icm.workingTRCSlope = icm.workingTRCSlope && p.icm.workingTRCSlope == other.icm.workingTRCSlope;
icm.redPrimaryX = icm.redPrimaryX && p.icm.redPrimaryX == other.icm.redPrimaryX;
icm.redPrimaryY = icm.redPrimaryY && p.icm.redPrimaryY == other.icm.redPrimaryY;
icm.greenPrimaryX = icm.greenPrimaryX && p.icm.greenPrimaryX == other.icm.greenPrimaryX;
icm.greenPrimaryY = icm.greenPrimaryY && p.icm.greenPrimaryY == other.icm.greenPrimaryY;
icm.bluePrimaryX = icm.bluePrimaryX && p.icm.bluePrimaryX == other.icm.bluePrimaryX;
icm.bluePrimaryY = icm.bluePrimaryY && p.icm.bluePrimaryY == other.icm.bluePrimaryY;
icm.outputGamma = icm.outputGamma && p.icm.outputGamma == other.icm.outputGamma;
icm.outputSlope = icm.outputSlope && p.icm.outputSlope == other.icm.outputSlope;
icm.outputPrimariesPreset = icm.outputPrimariesPreset && p.icm.outputPimariesPreset == other.icm.outputPimariesPreset;
icm.outputProfileVersion = icm.outputProfileVersion && p.icm.outputProfileVersion == other.icm.outputProfileVersion;
icm.outputIlluminant = icm.outputIlluminant && p.icm.outputIlluminant == other.icm.outputIlluminant;
icm.workingTRC = icm.workingTRC && p.icm.workingTRC == other.icm.workingTRC; icm.workingTRC = icm.workingTRC && p.icm.workingTRC == other.icm.workingTRC;
raw.bayersensor.method = raw.bayersensor.method && p.raw.bayersensor.method == other.raw.bayersensor.method; raw.bayersensor.method = raw.bayersensor.method && p.raw.bayersensor.method == other.raw.bayersensor.method;
raw.bayersensor.imageNum = raw.bayersensor.imageNum && p.raw.bayersensor.imageNum == other.raw.bayersensor.imageNum; raw.bayersensor.imageNum = raw.bayersensor.imageNum && p.raw.bayersensor.imageNum == other.raw.bayersensor.imageNum;
@ -2471,69 +2445,17 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
} }
if (icm.workingTRCGamma) { if (icm.workingTRCGamma) {
toEdit.icm.workingTRCGamma = dontforceSet && options.baBehav[ADDSET_FREE_OUPUT_GAMMA] ? toEdit.icm.workingTRCGamma + mods.icm.workingTRCGamma : mods.icm.workingTRCGamma; toEdit.icm.workingTRCGamma = mods.icm.workingTRCGamma;
} }
if (icm.workingTRCSlope) { if (icm.workingTRCSlope) {
toEdit.icm.workingTRCSlope = dontforceSet && options.baBehav[ADDSET_FREE_OUTPUT_SLOPE] ? toEdit.icm.workingTRCSlope + mods.icm.workingTRCSlope : mods.icm.workingTRCSlope; toEdit.icm.workingTRCSlope = mods.icm.workingTRCSlope;
}
if (icm.outputGamma) {
toEdit.icm.outputGamma = mods.icm.outputGamma;
}
if (icm.outputSlope) {
toEdit.icm.outputSlope = mods.icm.outputSlope;
}
if (icm.redPrimaryX) {
toEdit.icm.redPrimaryX = mods.icm.redPrimaryX;
}
if (icm.redPrimaryY) {
toEdit.icm.redPrimaryY = mods.icm.redPrimaryY;
}
if (icm.greenPrimaryX) {
toEdit.icm.greenPrimaryX = mods.icm.greenPrimaryX;
}
if (icm.greenPrimaryY) {
toEdit.icm.greenPrimaryY = mods.icm.greenPrimaryY;
}
if (icm.bluePrimaryX) {
toEdit.icm.bluePrimaryX = mods.icm.bluePrimaryX;
}
if (icm.bluePrimaryY) {
toEdit.icm.bluePrimaryY = mods.icm.bluePrimaryY;
}
if (icm.outputGammaPreset) {
toEdit.icm.outputGammaPreset = mods.icm.outputGammaPreset;
}
if (icm.outputPrimariesPreset) {
toEdit.icm.outputPimariesPreset = mods.icm.outputPimariesPreset;
}
if (icm.outputProfileVersion) {
toEdit.icm.outputProfileVersion = mods.icm.outputProfileVersion;
}
if (icm.outputIlluminant) {
toEdit.icm.outputIlluminant = mods.icm.outputIlluminant;
} }
if (icm.workingTRC) { if (icm.workingTRC) {
toEdit.icm.workingTRC = mods.icm.workingTRC; toEdit.icm.workingTRC = mods.icm.workingTRC;
} }
if (icm.customOutputProfile) {
toEdit.icm.customOutputProfile = mods.icm.customOutputProfile;
}
if (raw.bayersensor.method) { if (raw.bayersensor.method) {
toEdit.raw.bayersensor.method = mods.raw.bayersensor.method; toEdit.raw.bayersensor.method = mods.raw.bayersensor.method;
} }

View File

@ -592,20 +592,6 @@ public:
bool outputProfile; bool outputProfile;
bool outputIntent; bool outputIntent;
bool outputBPC; bool outputBPC;
bool customOutputProfile;
bool outputPrimariesPreset;
bool redPrimaryX;
bool redPrimaryY;
bool greenPrimaryX;
bool greenPrimaryY;
bool bluePrimaryX;
bool bluePrimaryY;
bool outputGammaPreset;
bool outputGamma;
bool outputSlope;
bool outputProfileVersion;
bool outputIlluminant;
}; };
class WaveletParamsEdited class WaveletParamsEdited
{ {

View File

@ -292,8 +292,6 @@ Gtk::Widget* Preferences::getBatchProcPanel ()
mi = behModel->append (); mi = behModel->append ();
mi->set_value (behavColumns.label, M ("TP_GAMMA_OUTPUT")); mi->set_value (behavColumns.label, M ("TP_GAMMA_OUTPUT"));
appendBehavList (mi, M ("TP_GAMMA_CURV"), ADDSET_FREE_OUPUT_GAMMA, false);
appendBehavList (mi, M ("TP_GAMMA_SLOP"), ADDSET_FREE_OUTPUT_SLOPE, false);
mi = behModel->append (); mi = behModel->append ();
mi->set_value (behavColumns.label, M ("TP_CHMIXER_LABEL")); mi->set_value (behavColumns.label, M ("TP_CHMIXER_LABEL"));

View File

@ -21,6 +21,7 @@
#include "rtwindow.h" #include "rtwindow.h"
#include "options.h" #include "options.h"
#include "preferences.h" #include "preferences.h"
#include "iccprofilecreator.h"
#include "cursormanager.h" #include "cursormanager.h"
#include "rtimage.h" #include "rtimage.h"
#include "whitebalance.h" #include "whitebalance.h"
@ -228,6 +229,12 @@ RTWindow::RTWindow ()
iFullscreen = new RTImage ("fullscreen.png"); iFullscreen = new RTImage ("fullscreen.png");
iFullscreen_exit = new RTImage ("fullscreen-exit.png"); iFullscreen_exit = new RTImage ("fullscreen-exit.png");
Gtk::Button* iccProfileCreator = Gtk::manage (new Gtk::Button ());
setExpandAlignProperties (iccProfileCreator, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
iccProfileCreator->set_image (*Gtk::manage (new RTImage ("gamut-plus.png")));
iccProfileCreator->set_tooltip_markup (M ("MAIN_BUTTON_ICCPROFCREATOR"));
iccProfileCreator->signal_clicked().connect ( sigc::mem_fun (*this, &RTWindow::showICCProfileCreator) );
//Gtk::LinkButton* rtWeb = Gtk::manage (new Gtk::LinkButton ("http://rawtherapee.com")); // unused... but fail to be linked anyway !? //Gtk::LinkButton* rtWeb = Gtk::manage (new Gtk::LinkButton ("http://rawtherapee.com")); // unused... but fail to be linked anyway !?
//Gtk::Button* preferences = Gtk::manage (new Gtk::Button (M("MAIN_BUTTON_PREFERENCES")+"...")); //Gtk::Button* preferences = Gtk::manage (new Gtk::Button (M("MAIN_BUTTON_PREFERENCES")+"..."));
Gtk::Button* preferences = Gtk::manage (new Gtk::Button ()); Gtk::Button* preferences = Gtk::manage (new Gtk::Button ());
@ -256,6 +263,7 @@ RTWindow::RTWindow ()
prProgBar.set_inverted (true); prProgBar.set_inverted (true);
actionGrid->set_orientation (Gtk::ORIENTATION_VERTICAL); actionGrid->set_orientation (Gtk::ORIENTATION_VERTICAL);
actionGrid->attach_next_to (prProgBar, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (prProgBar, Gtk::POS_BOTTOM, 1, 1);
actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_BOTTOM, 1, 1);
actionGrid->attach_next_to (*preferences, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_BOTTOM, 1, 1);
actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_BOTTOM, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_BOTTOM, 1, 1);
mainNB->set_action_widget (actionGrid, Gtk::PACK_END); mainNB->set_action_widget (actionGrid, Gtk::PACK_END);
@ -263,6 +271,7 @@ RTWindow::RTWindow ()
prProgBar.set_orientation (Gtk::ORIENTATION_HORIZONTAL); prProgBar.set_orientation (Gtk::ORIENTATION_HORIZONTAL);
actionGrid->set_orientation (Gtk::ORIENTATION_HORIZONTAL); actionGrid->set_orientation (Gtk::ORIENTATION_HORIZONTAL);
actionGrid->attach_next_to (prProgBar, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (prProgBar, Gtk::POS_RIGHT, 1, 1);
actionGrid->attach_next_to (*iccProfileCreator, Gtk::POS_RIGHT, 1, 1);
actionGrid->attach_next_to (*preferences, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*preferences, Gtk::POS_RIGHT, 1, 1);
actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_RIGHT, 1, 1); actionGrid->attach_next_to (*btn_fullscreen, Gtk::POS_RIGHT, 1, 1);
mainNB->set_action_widget (actionGrid, Gtk::PACK_END); mainNB->set_action_widget (actionGrid, Gtk::PACK_END);
@ -747,6 +756,23 @@ void RTWindow::writeToolExpandedStatus (std::vector<int> &tpOpen)
} }
void RTWindow::showICCProfileCreator ()
{
ICCProfileCreator *iccpc = new ICCProfileCreator (this);
iccpc->run ();
delete iccpc;
fpanel->optionsChanged ();
if (epanel) {
epanel->defaultMonitorProfileChanged (options.rtSettings.monitorProfile, options.rtSettings.autoMonitorProfile);
}
for (const auto &p : epanels) {
p.second->defaultMonitorProfileChanged (options.rtSettings.monitorProfile, options.rtSettings.autoMonitorProfile);
}
}
void RTWindow::showPreferences () void RTWindow::showPreferences ()
{ {
Preferences *pref = new Preferences (this); Preferences *pref = new Preferences (this);

View File

@ -86,6 +86,7 @@ public:
bool on_window_state_event (GdkEventWindowState* event); bool on_window_state_event (GdkEventWindowState* event);
void on_mainNB_switch_page (Gtk::Widget* widget, guint page_num); void on_mainNB_switch_page (Gtk::Widget* widget, guint page_num);
void showICCProfileCreator ();
void showPreferences (); void showPreferences ();
void on_realize (); void on_realize ();
void toggle_fullscreen (); void toggle_fullscreen ();

View File

@ -515,7 +515,6 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool
ipc->setAutoBWListener (blackwhite); ipc->setAutoBWListener (blackwhite);
ipc->setFrameCountListener (bayerprocess); ipc->setFrameCountListener (bayerprocess);
ipc->setAutoWBListener (whitebalance); ipc->setAutoWBListener (whitebalance);
ipc->setICMListener (icm);
ipc->setAutoColorTonListener (colortoning); ipc->setAutoColorTonListener (colortoning);
ipc->setAutoChromaListener (dirpyrdenoise); ipc->setAutoChromaListener (dirpyrdenoise);
ipc->setWaveletListener (wavelet); ipc->setWaveletListener (wavelet);