Creation of the ICCProfileCreator
This commit is contained in:
parent
e2dc8ea2c3
commit
fb0c95969b
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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++) {
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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]);
|
||||
}
|
||||
|
@ -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")) {
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -71,6 +71,7 @@ set(NONCLISOURCEFILES
|
||||
histogrampanel.cc
|
||||
history.cc
|
||||
hsvequalizer.cc
|
||||
iccprofilecreator.cc
|
||||
icmpanel.cc
|
||||
ilabel.cc
|
||||
imagearea.cc
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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
904
rtgui/iccprofilecreator.cc
Normal 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
88
rtgui/iccprofilecreator.h
Normal 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);
|
||||
};
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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"));
|
||||
|
@ -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);
|
||||
|
@ -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 ();
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user