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_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_COLPROF;Profils couleur
FILECHOOSER_FILTER_COLPROF;Profils couleur (*.icc)
FILECHOOSER_FILTER_CURVE;Fichiers de courbe
FILECHOOSER_FILTER_LCP;Profils de correction d'objectif
FILECHOOSER_FILTER_PP;Fichiers de traitement
@ -228,6 +228,7 @@ GENERAL_OK;OK
GENERAL_OPEN;Ouvrir
GENERAL_PORTRAIT;Portrait
GENERAL_SAVE;Enregistrer
GENERAL_SAVE_AS;Enregistrer sous...
GENERAL_SLIDER;Curseur
GENERAL_UNCHANGED;(Inchangé)
GENERAL_WARNING;Attention
@ -725,6 +726,7 @@ HISTORY_NEWSNAPSHOT;Ajouter
HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourci: <b>Alt-s</b>
HISTORY_SNAPSHOT;Capture
HISTORY_SNAPSHOTS;Captures
ICCPROFCREATOR_SAVEDIALOG_TITLE;Enregistrer le profil ICC sous...
IPTCPANEL_CATEGORY;Catégorie
IPTCPANEL_CATEGORYHINT;Identifie le sujet de l'image selon l'opinion du fournisseur.
IPTCPANEL_CITY;Ville
@ -772,6 +774,7 @@ LENSPROFILE_CORRECTION_LCPFILE;Fichier LCP
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.
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_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).
@ -860,7 +863,7 @@ NAVIGATOR_S;S:
NAVIGATOR_V;V:
NAVIGATOR_XY_FULL;Largeur = %1, Hauteur = %2
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_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

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_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_COLPROF;Color profiles
FILECHOOSER_FILTER_COLPROF;Color profiles (*.icc)
FILECHOOSER_FILTER_CURVE;Curve files
FILECHOOSER_FILTER_LCP;Lens correction profiles
FILECHOOSER_FILTER_PP;Processing profiles
@ -233,6 +233,7 @@ GENERAL_OPEN;Open
GENERAL_PORTRAIT;Portrait
GENERAL_RESET;Reset
GENERAL_SAVE;Save
GENERAL_SAVE_AS;Save as...
GENERAL_SLIDER;Slider
GENERAL_UNCHANGED;(Unchanged)
GENERAL_WARNING;Warning
@ -752,6 +753,7 @@ HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: <b>Alt-s</b>
HISTORY_SNAPSHOT;Snapshot
HISTORY_SNAPSHOTS;Snapshots
ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as...
IPTCPANEL_CATEGORY;Category
IPTCPANEL_CATEGORYHINT;Identifies the subject of the image in the opinion of the provider.
IPTCPANEL_CITY;City
@ -799,6 +801,7 @@ LENSPROFILE_CORRECTION_LCPFILE;LCP File
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.
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_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).
@ -1602,49 +1605,47 @@ TP_FLATFIELD_BT_VERTICAL;Vertical
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_LABEL;Flat-Field
TP_GAMMA_CURV;Gamma
TP_GAMMA_CUSTOM;Custom output profile
TP_GAMMA_PRIM;Primaries:
TP_GAMMA_OUTPUT_TRC_PRESET;Tone response curve
TP_GAMMA_PROF;Generate ICC profile:
TP_GAMMA_PROF_NONE;none
TP_GAMMA_PROF_V2;ICC v2
TP_GAMMA_PROF_V4;ICC v4
TP_GAMMA_SLOP;Slope
TP_GAMMA_PRIM_ACESP0;AcesP0
TP_GAMMA_PRIM_ACESP1;AcesP1
TP_GAMMA_PRIM_ADOBE;Adobe
TP_GAMMA_PRIM_PROPH;Prophoto
TP_GAMMA_PRIM_REC2020;Rec2020
TP_GAMMA_PRIM_SRGB;sRGB
TP_GAMMA_PRIM_WIDEG;Widegamut
TP_GAMMA_PRIM_BEST;BestRGB
TP_GAMMA_PRIM_BETA;BetaRGB
TP_GAMMA_PRIM_BRUCE;BruceRGB
TP_GAMMA_PRIM_FREE;Custom primaries - ICC v4
TP_GAMMA_PRIM_REDX;Red X
TP_GAMMA_PRIM_REDY;Red Y
TP_GAMMA_PRIM_GREX;Green X
TP_GAMMA_PRIM_GREY;Green Y
TP_GAMMA_PRIM_BLUX;Blue X
TP_GAMMA_PRIM_BLUY;Blue Y
TP_GAMMA_TEMP;Illuminant (ICC v4)
TP_GAMMA_TEMP_DEF;Default
TP_GAMMA_TEMP_41;D41
TP_GAMMA_TEMP_50;D50
TP_GAMMA_TEMP_55;D55
TP_GAMMA_TEMP_60;D60
TP_GAMMA_TEMP_65;D65
TP_GAMMA_TEMP_80;D80
TP_GAMMA_TEMP_INC;StdA 2856K
TP_GAMMA_TEMP_TOOLTIP;You can only change the Illuminant and Custom Primaries if you generate an ICC v4 profile
TP_GAMMA_WORKTRC;Tone response curve:
TP_GAMMA_WORKTRC_NONE;None
TP_GAMMA_WORKTRC_CUSTOM;Custom
TP_GAMMA_WORKTRC_TOOLTIP;Only for build in profiles
TP_GAMMA_WORKTRC_GAMMA;Gamma
TP_GAMMA_WORKTRC_SLOPE;Slope
ICCPROFCREATOR_CUSTOM;Custom
ICCPROFCREATOR_GAMMA;Gamma
ICCPROFCREATOR_PRIMARIES;Primaries:
ICCPROFCREATOR_TRC_PRESET;Tone response curve:
ICCPROFCREATOR_ICCVERSION;Generated profile's version:
ICCPROFCREATOR_PROF_V2;ICC v2
ICCPROFCREATOR_PROF_V4;ICC v4
ICCPROFCREATOR_SLOPE;Slope
ICCPROFCREATOR_PRIM_ACESP0;AcesP0
ICCPROFCREATOR_PRIM_ACESP1;AcesP1
ICCPROFCREATOR_PRIM_ADOBE;Adobe
ICCPROFCREATOR_PRIM_PROPH;Prophoto
ICCPROFCREATOR_PRIM_REC2020;Rec2020
ICCPROFCREATOR_PRIM_SRGB;sRGB
ICCPROFCREATOR_PRIM_WIDEG;Widegamut
ICCPROFCREATOR_PRIM_BEST;BestRGB
ICCPROFCREATOR_PRIM_BETA;BetaRGB
ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
ICCPROFCREATOR_PRIM_TOOLTIP;You can only set Custom Primaries with ICC v4 profiles
ICCPROFCREATOR_PRIM_REDX;Red X
ICCPROFCREATOR_PRIM_REDY;Red Y
ICCPROFCREATOR_PRIM_GREX;Green X
ICCPROFCREATOR_PRIM_GREY;Green Y
ICCPROFCREATOR_PRIM_BLUX;Blue X
ICCPROFCREATOR_PRIM_BLUY;Blue Y
ICCPROFCREATOR_ILL;Illuminant:
ICCPROFCREATOR_ILL_DEF;Default
ICCPROFCREATOR_ILL_41;D41
ICCPROFCREATOR_ILL_50;D50
ICCPROFCREATOR_ILL_55;D55
ICCPROFCREATOR_ILL_60;D60
ICCPROFCREATOR_ILL_65;D65
ICCPROFCREATOR_ILL_80;D80
ICCPROFCREATOR_ILL_INC;StdA 2856K
ICCPROFCREATOR_ILL_TOOLTIP;You can only set Illuminant with ICC v4 profiles
TP_ICM_WORKTRC;Tone response curve:
TP_ICM_WORKTRC_NONE;None
TP_ICM_WORKTRC_CUSTOM;Custom
TP_ICM_WORKTRC_TOOLTIP;Only for build in profiles
TP_ICM_WORKTRC_GAMMA;Gamma
TP_ICM_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_GRADIENT_CENTER;Center
TP_GRADIENT_CENTER_X;Center X

View File

@ -1074,34 +1074,34 @@ public:
/**
* @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]
* @return the gamma modified's value [0 ; 1]
*/
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.0031308 ? x * 12.92 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous
// 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.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;//standard discontinuous
//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.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
* 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]
* @return the inverse gamma modified's value [0 ; 1]
*/
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.04045 ? x / 12.92 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous
// 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.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);//standard discontinuous
//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.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
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)
{
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)
{
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)
{
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
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;
} 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]);
}
cinfo.err = jpeg_std_error (&jerr);
@ -6608,7 +6608,7 @@ void CLASS apply_tiff()
if (model[0] == 'N') load_flags = 80;
} else if (raw_width*raw_height*3 == tiff_ifd[raw].bytes) {
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);
filters = 0;
} else if (raw_width*raw_height*2 == tiff_ifd[raw].bytes) {
@ -8920,7 +8920,7 @@ void CLASS identify()
strcpy (model,"One");
parse_redcine();
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;
} else if (!memcmp (head,"DSC-Image",9))
parse_rollei();

View File

@ -819,12 +819,7 @@ void Crop::update(int todo)
int ch = baseCrop->getHeight();
Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6;
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);
readyImg0 = parent->ipf.workingtrc(baseCrop, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {
@ -836,11 +831,10 @@ void Crop::update(int todo)
}
delete readyImg0;
//adjust gamma TRC
Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope;
mul = 5;
readyImg = parent->ipf.workingtrc(baseCrop, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
readyImg = parent->ipf.workingtrc(baseCrop, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {
@ -852,7 +846,6 @@ void Crop::update(int todo)
}
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.xtranssensor.method = RAWParams::XTransSensor::getMethodString(RAWParams::XTransSensor::Method::FAST);
neutral.icm.outputProfile = "sRGB";
neutral.icm.outputGammaPreset = "Custom";
neutral.icm.customOutputProfile = false;
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(*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* 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
//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
//std22 g=2.2 std18 g=1.8
// 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();
}
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
cmsHPROFILE rtengine::ICCStore::makeStdGammaProfile(cmsHPROFILE iprof)
{
@ -1247,7 +1155,7 @@ cmsHPROFILE rtengine::ICCStore::createFromMatrix(const double matrix[3][3], bool
pcurve[2] = 1;
// pcurve[3] = 0x1f00000;// pcurve for gamma BT709 : g=2.22 s=4.5
// 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 {
// 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;
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;
/*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 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:
class Implementation;

View File

@ -93,7 +93,7 @@ ImProcCoordinator::ImProcCoordinator()
fw(0), fh(0), tr(0),
fullw(1), fullh(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),
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();
// put gamma TRC to 1
Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6;
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);
readyImg0 = ipf.workingtrc(oprevi, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {
@ -513,9 +509,7 @@ void ImProcCoordinator::updatePreviewImage(int todo, Crop* cropCall)
delete readyImg0;
//adjust TRC
Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope;
mul = 5;
readyImg = ipf.workingtrc(oprevi, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
readyImg = ipf.workingtrc(oprevi, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {

View File

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

View File

@ -346,9 +346,9 @@ public:
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);
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;
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, 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
* 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) {
@ -306,85 +306,75 @@ Imagefloat* ImProcFunctions::lab2rgbOut(LabImage* lab, int cx, int cy, int cw, i
cmsHPROFILE oprof = nullptr;
if (ga) {
lcmsMutex->lock();
ICCStore::getInstance()->getGammaArray(icm, *ga);
oprof = ICCStore::getInstance()->createGammaProfile(icm, *ga);
lcmsMutex->unlock();
} else {
oprof = ICCStore::getInstance()->getProfile(icm.outputProfile);
Glib::ustring outtest = icm.outputProfile;
std::string fileis_RTv2 = outtest.substr(0, 4);
//printf("IsRTv2=%s\n", fileis_RTv2.c_str());
if(fileis_RTv2 == "RTv2") {//Only fot ICC v2 : read tag from desc to retrieve gamma and slope save before in generate ICC v2
//due to bug in LCMS in CmsToneCurve
//printf("icmout=%s \n",icm.output.c_str());
GammaValues g_b; //gamma parameters
GammaValues gb; //gamma parameters
const double eps = 0.000000001; // not divide by zero
double gammatag = 2.4;
double slopetag = 12.92;
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;
oprof = ICCStore::getInstance()->getProfile(icm.outputProfile);
Glib::ustring outtest = icm.outputProfile;
std::string fileis_RTv2 = outtest.substr(0, 4);
//printf("IsRTv2=%s\n", fileis_RTv2.c_str());
if(fileis_RTv2 == "RTv2") {//Only fot ICC v2 : read tag from desc to retrieve gamma and slope save before in generate ICC v2
//due to bug in LCMS in CmsToneCurve
//printf("icmout=%s \n",icm.output.c_str());
GammaValues g_b; //gamma parameters
const double eps = 0.000000001; // not divide by zero
double gammatag = 2.4;
double slopetag = 12.92310;
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
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) {
modelDesc.assign(cModelDesc);
g_free(cModelDesc);
}
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) {
modelDesc.assign(cModelDesc);
g_free(cModelDesc);
}
#else
modelDesc = utf32_to_utf8(buffer, count);
modelDesc = utf32_to_utf8(buffer, count);
#endif
delete [] buffer;
if (!modelDesc.empty()) {
printf("dmdd=%s\n", modelDesc.c_str());
delete [] buffer;
if (!modelDesc.empty()) {
printf("dmdd=%s\n", modelDesc.c_str());
std::size_t pos = modelDesc.find("g");
std::size_t posmid = modelDesc.find("s");
std::size_t posend = modelDesc.find("!");
std::string strgamma = modelDesc.substr(pos + 1, (posmid - pos));
gammatag = std::stod(strgamma.c_str());
std::string strslope = modelDesc.substr(posmid + 1, (posend - posmid));
slopetag = std::stod(strslope.c_str());
// printf("gam=%f slo=%f\n", gammatag, slopetag);
}
} else {
printf("Error: lab2rgbOut / String length is null!\n");
std::size_t pos = modelDesc.find("g");
std::size_t posmid = modelDesc.find("s");
std::size_t posend = modelDesc.find("!");
std::string strgamma = modelDesc.substr(pos + 1, (posmid - pos));
gammatag = std::stod(strgamma.c_str());
std::string strslope = modelDesc.substr(posmid + 1, (posend - posmid));
slopetag = std::stod(strslope.c_str());
// printf("gam=%f slo=%f\n", gammatag, slopetag);
}
} else {
printf("Error: lab2rgbOut / cmsReadTag/cmsSigDeviceModelDescTag failed!\n");
printf("Error: lab2rgbOut / String length is null!\n");
}
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
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]);
} else {
printf("Error: lab2rgbOut / cmsReadTag/cmsSigDeviceModelDescTag failed!\n");
}
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) {
@ -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;
@ -474,7 +464,6 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
int five = mul;
ga6 = 0.0;
pwr = 1.0 / gampos;
if (gampos < 1.0) {
@ -592,15 +581,6 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
int mode = 0;
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;
cmsCIExyYTRIPLE Primaries = {
@ -610,17 +590,19 @@ Imagefloat* ImProcFunctions::workingtrc(Imagefloat* working, int cw, int ch, int
};
cmsToneCurve* GammaTRC[3];
cmsFloat64Number Parameters[7];
Parameters[0] = ga0;
Parameters[1] = ga1;
Parameters[2] = ga2;
Parameters[3] = ga3;
Parameters[4] = ga4;
Parameters[5] = ga5;
Parameters[6] = ga6;
// 7 parameters for smoother curves
cmsFloat64Number gammaParams[7];
gammaParams[4] = g_a[3] * ts;
gammaParams[0] = gampos;
gammaParams[1] = 1. / (1.0 + g_a[4]);
gammaParams[2] = g_a[4] / (1.0 + g_a[4]);
gammaParams[3] = 1. / slpos;
gammaParams[5] = 0.0;
gammaParams[6] = 0.0;
// 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);
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);
cmsFreeToneCurve(GammaTRC[0]);
}

View File

@ -1960,20 +1960,7 @@ ColorManagementParams::ColorManagementParams() :
workingTRCSlope(12.92310),
outputProfile("RT_sRGB"),
outputIntent(RI_RELATIVE),
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")
outputBPC(true)
{
}
@ -1992,20 +1979,7 @@ bool ColorManagementParams::operator ==(const ColorManagementParams& other) cons
&& workingTRCSlope == other.workingTRCSlope
&& outputProfile == other.outputProfile
&& outputIntent == other.outputIntent
&& 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;
&& outputBPC == other.outputBPC;
}
bool ColorManagementParams::operator !=(const ColorManagementParams& other) const
@ -3197,19 +3171,6 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo
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
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", 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")) {

View File

@ -1025,20 +1025,6 @@ struct ColorManagementParams {
RenderingIntent outputIntent;
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;
ColorManagementParams();

View File

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

View File

@ -881,9 +881,7 @@ private:
ipf.lab2rgb (labcbdl, *baseImg, params.icm.workingProfile);
}
//gamma TRC working
{
//gamma TRC working
if (params.icm.workingTRC == "Custom") { //exec TRC IN free
Glib::ustring profile;
profile = params.icm.workingProfile;
@ -893,11 +891,7 @@ private:
int ch = baseImg->getHeight();
// put gamma TRC to 1
Imagefloat* readyImg0 = NULL;
double ga0, ga1, ga2, ga3, ga4, ga5, ga6;
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);
readyImg0 = ipf.workingtrc(baseImg, cw, ch, -5, params.icm.workingProfile, 2.4, 12.92310);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {
@ -909,11 +903,10 @@ private:
}
delete readyImg0;
//adjust TRC
Imagefloat* readyImg = NULL;
gga = params.icm.outputGamma, ssl = params.icm.outputSlope;
mul = 5;
readyImg = ipf.workingtrc(baseImg, cw, ch, mul, params.icm.workingProfile, gga, ssl, ga0, ga1, ga2, ga3, ga4, ga5, ga6);
readyImg = ipf.workingtrc(baseImg, cw, ch, 5, params.icm.workingProfile, params.icm.workingTRCGamma, params.icm.workingTRCSlope);
#pragma omp parallel for
for (int row = 0; row < ch; row++) {
@ -925,12 +918,9 @@ private:
}
delete readyImg;
}
}
}
// RGB processing
curve1 (65536);
@ -1260,30 +1250,16 @@ private:
bool useLCMS = false;
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(params.blackwhite.enabled) params.toneCurve.hrenabled=false;
readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm, &ga);
customGamma = true;
// 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
//or selected Free gamma
useLCMS = false;
readyImg = ipf.lab2rgbOut (labView, cx, cy, cw, ch, params.icm);
if ((jprof = ICCStore::getInstance()->createCustomGammaOutputProfile (params.icm, ga)) == nullptr) {
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());
}
if (settings->verbose) {
printf ("Output profile_: \"%s\"\n", params.icm.outputProfile.c_str());
}
delete labView;

View File

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

View File

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

View File

@ -150,7 +150,6 @@ void BatchToolPanelCoordinator::initSession ()
prsharpening->setAdjusterBehavior (false, false, false, false, false, false, false);
sharpenEdge->setAdjusterBehavior (false, false);
sharpenMicro->setAdjusterBehavior (false, false, false);
icm->setAdjusterBehavior (false, false);
epd->setAdjusterBehavior (false, false, 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]);
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_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]);
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_Q]) { pparams.colorappearance.qcontrast = 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_CS_BLUEYELLOW]) pparams.colorShift.a = 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.outputIntent = options.fastexport_icm_outputIntent;
params.icm.outputBPC = options.fastexport_icm_outputBPC;
params.icm.outputGammaPreset = options.fastexport_icm_custom_output_profile;
}
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");
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->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);
iVBox = Gtk::manage(new Gtk::VBox());
iVBox->set_spacing(2);
inone = Gtk::manage(new Gtk::RadioButton(M("TP_ICM_INPUTNONE")));
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);
Gtk::VBox *wProfVBox = Gtk::manage(new Gtk::VBox());
wProfVBox->set_spacing(2);
wProfNames = Gtk::manage(new MyComboBoxText());
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());
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);
wTRC = Gtk::manage(new MyComboBoxText());
wTRCHBox->pack_start(*wTRC, Gtk::PACK_EXPAND_WIDGET);
wProfVBox->pack_start(*wTRCHBox, Gtk::PACK_EXPAND_WIDGET);
wTRC->append(M("TP_GAMMA_WORKTRC_NONE"));
wTRC->append(M("TP_GAMMA_WORKTRC_CUSTOM"));
wTRC->append(M("TP_ICM_WORKTRC_NONE"));
wTRC->append(M("TP_ICM_WORKTRC_CUSTOM"));
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));
wSlope = Gtk::manage(new Adjuster(M("TP_GAMMA_WORKTRC_SLOPE"), 0., 150., 0.01, 12.92));
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_ICM_WORKTRC_SLOPE"), 0., 150., 0.01, 12.92310));
wProfVBox->pack_start(*wGamma, Gtk::PACK_SHRINK);
wGamma->show();
@ -234,7 +232,6 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha
oFrame->set_label_align(0.025, 0.5);
Gtk::VBox *oProfVBox = Gtk::manage(new Gtk::VBox());
oProfVBox->set_spacing(2);
oProfNames = Gtk::manage(new MyComboBoxText());
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);
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);
pack_start(*oFrame, Gtk::PACK_EXPAND_WIDGET);
// ---------------------------- 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));
oprofnamesconn = oProfNames->signal_changed().connect(sigc::mem_fun(*this, &ICMPanel::opChanged));
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));
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));
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));
ltableconn = ckbApplyLookTable->signal_toggled().connect(sigc::mem_fun(*this, &ICMPanel::applyLookTableChanged));
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 ipc_(ipc);
ConnectionBlocker coprofconn_(coprofconn);
ConnectionBlocker tcurveconn_(tcurveconn);
ConnectionBlocker ltableconn_(ltableconn);
ConnectionBlocker beoconn_(beoconn);
@ -664,11 +492,7 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
ConnectionBlocker wprofnamesconn_(wprofnamesconn);
ConnectionBlocker oprofnamesconn_(oprofnamesconn);
ConnectionBlocker orendintentconn_(orendintentconn);
ConnectionBlocker otrcconn_(otrcconn);
ConnectionBlocker dcpillconn_(dcpillconn);
ConnectionBlocker primariesconn_(primariesconn);
ConnectionBlocker wprofileconn_(wprofileconn);
ConnectionBlocker oillconn_(oillconn);
if (pp->icm.inputProfile.substr(0, 5) != "file:" && !ipDialog->get_filename().empty()) {
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);
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") {
wTRC->set_active(0);
@ -761,23 +534,6 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited)
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();
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);
lastApplyHueSatMap = pp->icm.applyHueSatMap;
customOutProfile->set_active(pp->icm.customOutputProfile);
lastCustomOutputProfile = pp->icm.customOutputProfile;
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);
wGamma->setValue(pp->icm.workingTRCGamma);
wSlope->setValue(pp->icm.workingTRCSlope);
if (pedited) {
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);
ckbApplyBaselineExposureOffset->set_inconsistent(!pedited->icm.applyBaselineExposureOffset);
ckbApplyHueSatMap->set_inconsistent(!pedited->icm.applyHueSatMap);
customOutProfile->set_inconsistent(!pedited->icm.customOutputProfile);
if (!pedited->icm.workingProfile) {
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"));
}
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) {
wTRC->set_active_text(M("GENERAL_UNCHANGED"));
}
oGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
oSlope->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);
wGamma->setEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
wSlope->setEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited);
}
@ -920,10 +619,7 @@ void ICMPanel::write(ProcParams* pp, ParamsEdited* pedited)
}
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.outputPimariesPreset = primaries->get_active_text();
pp->icm.outputIlluminant = oIlluminant->get_active_text();
pp->icm.workingTRC = wTRC->get_active_text();
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;
}
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) {
pp->icm.workingTRC = "none";
} else if (wTRC->get_active_row_number() == 1) {
pp->icm.workingTRC = "Custom";
}
pp->icm.customOutputProfile = customOutProfile->get_active();
pp->icm.toneCurve = ckbToneCurve->get_active();
pp->icm.applyLookTable = ckbApplyLookTable->get_active();
pp->icm.applyBaselineExposureOffset = ckbApplyBaselineExposureOffset->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.redPrimaryX = (double) primariesRedX->getValue();
pp->icm.redPrimaryY = (double) primariesRedY->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();
pp->icm.workingTRCGamma = (double) wGamma->getValue();
pp->icm.workingTRCSlope = (double) wSlope->getValue();
if (pedited) {
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.applyBaselineExposureOffset = !ckbApplyBaselineExposureOffset->get_inconsistent();
pedited->icm.applyHueSatMap = !ckbApplyHueSatMap->get_inconsistent();
pedited->icm.outputGammaPreset = oTRCPresets->get_active_text() != M("GENERAL_UNCHANGED");
pedited->icm.customOutputProfile = !customOutProfile->get_inconsistent();
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.workingTRCGamma = wGamma->getEditedState();
pedited->icm.workingTRCSlope = wSlope->getEditedState();
pedited->icm.workingTRC = wTRC->get_active_text() != M("GENERAL_UNCHANGED");
}
}
void ICMPanel::setDefaults(const ProcParams* defParams, const ParamsEdited* pedited)
{
oGamma->setDefault(defParams->icm.workingTRCGamma);
oSlope->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);
wGamma->setDefault(defParams->icm.workingTRCGamma);
wSlope->setDefault(defParams->icm.workingTRCSlope);
if (pedited) {
oGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
oSlope->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);
wGamma->setDefaultEditedState(pedited->icm.workingTRCGamma ? Edited : UnEdited);
wSlope->setDefaultEditedState(pedited->icm.workingTRCSlope ? Edited : UnEdited);
} 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);
wSlope->setDefaultEditedState(Irrelevant);
}
}
void ICMPanel::setAdjusterBehavior(bool gammaadd, bool slopeadd)
{
oGamma->setAddMode(gammaadd);
oSlope->setAddMode(slopeadd);
}
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) {
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()
{
if (wprofile->get_active_row_number() == 2) {
oIlluminant->set_sensitive(true);
} else {
oIlluminant->set_sensitive(false);
}
if (listener) {
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()
{
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()
{
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()
{
@ -1375,111 +857,6 @@ void ICMPanel::ipChanged()
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()
{
if (!batchMode) {
@ -1650,14 +1027,8 @@ void ICMPanel::setBatchMode(bool batchMode)
oRendIntent->addEntry("unchanged-22.png", M("GENERAL_UNCHANGED"));
oRendIntent->show();
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"));
dcpIll->append(M("GENERAL_UNCHANGED"));
oGamma->showEditedCB();
oSlope->showEditedCB();
wGamma->showEditedCB();
wSlope->showEditedCB();
}

View File

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

View File

@ -198,6 +198,9 @@ void Options::updatePaths()
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()
@ -440,6 +443,19 @@ void Options::setDefaults()
menuGroupProfileOperations = 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_sharpenEdge = true;
fastexport_bypass_sharpenMicro = true;
@ -466,7 +482,6 @@ void Options::setDefaults()
fastexport_icm_output_profile = "RT_sRGB";
fastexport_icm_outputIntent = rtengine::RI_RELATIVE;
fastexport_icm_outputBPC = true;
fastexport_icm_custom_output_profile = "Custom";
fastexport_resize_enabled = true;
fastexport_resize_scale = 1;
fastexport_resize_appliesTo = "Cropped area";
@ -588,6 +603,7 @@ void Options::setDefaults()
lastProfilingReferenceDir = "";
lastBWCurvesDir = "";
lastLensProfileDir = "";
lastICCProfCreatorDir = "";
gimpPluginShowInfoDialog = true;
maxRecentFolders = 15;
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");
}
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")) {
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_key("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");
}
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")) {
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", "LastProfilingReferenceDir", lastProfilingReferenceDir);
safeDirGet(keyFile, "Dialogs", "LastLensProfileDir", lastLensProfileDir);
safeDirGet(keyFile, "Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir);
if (keyFile.has_key("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", "Rec2020", rtSettings.rec2020);
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_boolean("Color Management", "GamutICC", rtSettings.gamutICC);
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_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;
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_integer("Fast Export", "fastexport_icm_output_intent", fastexport_icm_outputIntent);
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_double("Fast Export", "fastexport_resize_scale", fastexport_resize_scale);
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", "LastProfilingReferenceDir", lastProfilingReferenceDir);
keyFile.set_string("Dialogs", "LastLensProfileDir", lastLensProfileDir);
keyFile.set_string("Dialogs", "LastICCProfCreatorDir", lastICCProfCreatorDir);
keyFile.set_boolean("Dialogs", "GimpPluginShowInfoDialog", gimpPluginShowInfoDialog);
keyFile.set_string("Lensfun", "DBDirectory", rtSettings.lensfunDbDirectory);

View File

@ -287,6 +287,20 @@ public:
bool menuGroupProfileOperations;
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
bool fastexport_bypass_sharpening;
bool fastexport_bypass_sharpenEdge;
@ -341,6 +355,7 @@ public:
Glib::ustring lastProfilingReferenceDir;
Glib::ustring lastBWCurvesDir;
Glib::ustring lastLensProfileDir;
Glib::ustring lastICCProfCreatorDir;
bool gimpPluginShowInfoDialog;
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.outputIntent = v;
icm.outputBPC = v;
icm.outputGammaPreset = v;
icm.customOutputProfile = v;
icm.workingTRCGamma = 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;
raw.bayersensor.method = 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.outputIntent = icm.outputIntent && p.icm.outputIntent == other.icm.outputIntent;
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.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;
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;
@ -2471,69 +2445,17 @@ void ParamsEdited::combine(rtengine::procparams::ProcParams& toEdit, const rteng
}
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) {
toEdit.icm.workingTRCSlope = dontforceSet && options.baBehav[ADDSET_FREE_OUTPUT_SLOPE] ? toEdit.icm.workingTRCSlope + mods.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;
toEdit.icm.workingTRCSlope = mods.icm.workingTRCSlope;
}
if (icm.workingTRC) {
toEdit.icm.workingTRC = mods.icm.workingTRC;
}
if (icm.customOutputProfile) {
toEdit.icm.customOutputProfile = mods.icm.customOutputProfile;
}
if (raw.bayersensor.method) {
toEdit.raw.bayersensor.method = mods.raw.bayersensor.method;
}

View File

@ -592,20 +592,6 @@ public:
bool outputProfile;
bool outputIntent;
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
{

View File

@ -292,8 +292,6 @@ Gtk::Widget* Preferences::getBatchProcPanel ()
mi = behModel->append ();
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->set_value (behavColumns.label, M ("TP_CHMIXER_LABEL"));

View File

@ -21,6 +21,7 @@
#include "rtwindow.h"
#include "options.h"
#include "preferences.h"
#include "iccprofilecreator.h"
#include "cursormanager.h"
#include "rtimage.h"
#include "whitebalance.h"
@ -228,6 +229,12 @@ RTWindow::RTWindow ()
iFullscreen = new RTImage ("fullscreen.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::Button* preferences = Gtk::manage (new Gtk::Button (M("MAIN_BUTTON_PREFERENCES")+"..."));
Gtk::Button* preferences = Gtk::manage (new Gtk::Button ());
@ -256,6 +263,7 @@ RTWindow::RTWindow ()
prProgBar.set_inverted (true);
actionGrid->set_orientation (Gtk::ORIENTATION_VERTICAL);
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 (*btn_fullscreen, Gtk::POS_BOTTOM, 1, 1);
mainNB->set_action_widget (actionGrid, Gtk::PACK_END);
@ -263,6 +271,7 @@ RTWindow::RTWindow ()
prProgBar.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 (*iccProfileCreator, 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);
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 ()
{
Preferences *pref = new Preferences (this);

View File

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

View File

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